Tôi nghĩ rằng tôi sẽ tiếp tục điều này. Điều đầu tiên là, làm thế nào để tài sản xác định một giá trị BOOL trong plist của bạn?
Apple's DTD for plist cho một đầu mối đàng hoàng:
<!ENTITY % plistObject "(array | data | date | dict | real | integer | string | true | false)" >
và sau:
<!-- Numerical primitives -->
<!ELEMENT true EMPTY> <!-- Boolean constant true -->
<!ELEMENT false EMPTY> <!-- Boolean constant false -->
Tất cả tuyệt vời, nhưng làm thế nào mà cái nhìn trong plist?
Vâng, đối với một giá trị đúng, nó sẽ là:
<dict>
<key>employeeId</key>
<integer>1</integer>
<key>name</key>
<string>Joe Smith</string>
<key>worksRemotely</key>
<true/>
</dict>
và tất nhiên cho sai:
<dict>
<key>employeeId</key>
<integer>1</integer>
<key>name</key>
<string>Joe Smith</string>
<key>worksRemotely</key>
<false/>
</dict>
Để tạo một đối tượng từ plist, như một người dùng quan tâm của Objectify, Tôi lấy cảm hứng từ các lớp nhà máy của họ. lớp Employee
của tôi sẽ có những phương pháp:
+ (Employee *)instanceFromDictionary:(NSDictionary *)aDictionary {
Employee *instance = [[Employee alloc] init];
[instance setAttributesFromDictionary:aDictionary];
return instance;
}
mà lần lượt gọi:
- (void)setAttributesFromDictionary:(NSDictionary *)aDictionary {
if (![aDictionary isKindOfClass:[NSDictionary class]]) {
return;
}
[self setValuesForKeysWithDictionary:aDictionary];
}
setValuesForKeysWithDictionary:aDictionary
là một thành viên của NSKeyValueCoding Protocol. Điều đó có sẵn với mỗi NSObject
có nghĩa là như một lớp con của NSObject
, lớp học Employee
của chúng tôi nhận được điều đó miễn phí.
Miễn là thuộc tính lớp nhân viên của tôi khớp với các giá trị khóa được chỉ định trong plist, cụ thể là employeeId
, name
và worksRemotely
, thì tôi sẽ không cần phải làm gì khác. phương pháp mà sẽ dịch các worksRemotely
boolean xác định trong plist với giá trị đúng trong trường hợp lớp học của tôi:
@property (assign, nonatomic, getter = isWorkingRemotely) BOOL worksRemotely;
Tất cả những gì còn lại là để lặp qua các nội dung plist, tạo các instance của lớp tôi mong muốn, bool bao gồm:
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];
}
Không nghi ngờ gì tôi đã vượt qua hàng đầu để trả lời câu hỏi cụ thể. Tuy nhiên, hy vọng điều này có thể được sử dụng cho một người khác tình cờ gặp câu hỏi này trong khi cố gắng làm những gì tôi đang cố gắng, tức là tạo ra một lớp học với một giá trị boolean trong một plist.