想我會在這個芯片。首先,如何在plist中定義一個BOOL值?
Apple's DTD for plist給出了一個體面的線索:
<!ENTITY % plistObject "(array | data | date | dict | real | integer | string | true | false)" >
及更高版本:
<!-- Numerical primitives -->
<!ELEMENT true EMPTY> <!-- Boolean constant true -->
<!ELEMENT false EMPTY> <!-- Boolean constant false -->
所有偉大的,但如何做的plist中那個樣子?
那麼,對於一個真正的價值,這將是:
<dict>
<key>employeeId</key>
<integer>1</integer>
<key>name</key>
<string>Joe Smith</string>
<key>worksRemotely</key>
<true/>
</dict>
當然假的和:
<dict>
<key>employeeId</key>
<integer>1</integer>
<key>name</key>
<string>Joe Smith</string>
<key>worksRemotely</key>
<false/>
</dict>
從plist中創建一個對象,作爲Objectify敏銳的用戶,我從他們的工廠課程中獲得靈感。我Employee
類需要有這些方法:
+ (Employee *)instanceFromDictionary:(NSDictionary *)aDictionary {
Employee *instance = [[Employee alloc] init];
[instance setAttributesFromDictionary:aDictionary];
return instance;
}
,反過來呼籲:
- (void)setAttributesFromDictionary:(NSDictionary *)aDictionary {
if (![aDictionary isKindOfClass:[NSDictionary class]]) {
return;
}
[self setValuesForKeysWithDictionary:aDictionary];
}
setValuesForKeysWithDictionary:aDictionary
是NSKeyValueCoding Protocol的成員。每個NSObject
都有這個功能,這意味着作爲NSObject
的一個子類,我們的Employee
類可以免費獲得。
只要我的Employee類的屬性與plist中指定的鍵值匹配,即employeeId
,name
和worksRemotely
,那麼我就不需要做任何其他操作。該方法將在我的類的實例翻譯的plist中指定正確的值worksRemotely
布爾:
@property (assign, nonatomic, getter = isWorkingRemotely) BOOL worksRemotely;
所有剩下的就是通過plist中內容重複,創造我想要的類的實例,布爾包括:
NSString *plistPath = [[NSBundle bundleForClass:[self class]] pathForResource:@"employees" ofType:@"plist"];
NSArray *employeeDictionaries = [NSArray arrayWithContentsOfFile:plistPath];
for (NSDictionary *employeeDict in employeeDictionaries) {
Employee *employee = [Employee instanceFromDictionary:employeeDict];
[employees addObject:employee];
}
毫無疑問,我已經回答了具體問題的頂部。然而,希望這可以用於其他人,他試圖做我正在嘗試的事情時偶然發現了這個問題,即在plist中創建一個具有布爾值的類。