Jan*_*eje 5 swift swift-extensions
Bonjour,我想把一个客观的练习从Aaron的书翻译成快速但我无法找到解决方案.Objective'c代码是:
@dynamic firstName;
@dynamic lastName;
@dynamic department;
+ (NSSet *)keyPathsForValuesAffectingFullName
{
return [NSSet setWithObjects:@"firstName", @"lastName", nil];
}
- (NSString *)fullName
{
NSString *first = [self firstName];
NSString *last = [self lastName];
if (!first)
return last;
if (!last)
return first;
return [NSString stringWithFormat:@"%@ %@", first, last];
}
Run Code Online (Sandbox Code Playgroud)
我在开发人员文档中找到了一个函数,但我无法理解如何实现此代码.
更明确一点,这是Apple doc
一对一的关系
要为一对一关系自动触发通知,您应该覆盖keyPathsForValuesAffectingValueForKey:或者实现一个合适的方法,该方法遵循它为注册依赖键定义的模式.
例如,人的全名取决于名字和姓氏.返回全名的方法可以写成如下:
- (NSString *)fullName {
return [NSString stringWithFormat:@"%@ %@",firstName, lastName];
}
Run Code Online (Sandbox Code Playgroud)
当firstName或lastName属性发生更改时,必须通知观察fullName属性的应用程序,因为它们会影响属性的值.
一种解决方案是覆盖keyPathsForValuesAffectingValueForKey:指定人员的fullName属性依赖于lastName和firstName属性.清单1显示了这种依赖的示例实现:
清单1 keyPathsForValuesAffectingValueForKey的示例实现:
+ (NSSet *)keyPathsForValuesAffectingValueForKey:(NSString *)key {
NSSet *keyPaths = [super keyPathsForValuesAffectingValueForKey:key];
if ([key isEqualToString:@"fullName"]) {
NSArray *affectingKeys = @[@"lastName", @"firstName"];
keyPaths = [keyPaths setByAddingObjectsFromArray:affectingKeys];
}
return keyPaths;
}
class func keyPathsForValuesAffectingValueForKey(_ key: String) -> NSSet
Run Code Online (Sandbox Code Playgroud)
有人能告诉我如何在swift中实现这个功能吗?
感谢你们对我的帮助.
我找到了解决问题的方法!只是覆盖FUNC keyPathsForValuesAffectingValueForKey(键:字符串)与班前
这里的代码:
class Locataires: NSManagedObject {
@NSManaged var firstName: String
@NSManaged var lastName: String
var fullName: NSString {
get {
return firstName + lastName
}
}
override class func keyPathsForValuesAffectingValueForKey(key: String) -> NSSet {
if key == «fullName « {
let mesClefs = ["firstName", "lastName"]
return NSSet(array: mesClefs)
}
else {
return super.keyPathsForValuesAffectingValueForKey(key)
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助Jan