我正在尝试为一个简单的 transient 属性实现一个 getter 方法。 transient 属性是一个 fullName 属性。 fullName = firstName + lastName 的典型示例。
我正在开发一个 iOS 应用(以防相关的东西在 OS X 上的工作方式不同)
在“掌握核心数据”WWDC 2010 主题演讲之后,我为我的 Person NSManagedObject 子类创建了一个类别。在该类别中,我添加了以下方法:
- (NSString *)fullName {
[self willAccessValueForKey"fullName"];
NSString *fullName = [self primitiveFullName];
[self didACCessValueForKey"fullName"];
if (fullName == nil) {
fullName = [NSString stringWithFormat"%@ %@", self.firstName, self.lastName];
[self setPrimitiveFullName:fullName];
}
return fullName;}
Person 类已由 Xcode 自动创建,并具有 fullName 属性及其使用 @dynamic 的实现。
当我尝试编译项目时,我收到此类别的错误消息“没有可见的 @interface for 'Person' 声明选择器 'primitiveFullName'”。
为什么当 Apple 文档显示“例如,给定具有属性 firstName 的实体,Core Data 会自动生成 firstName、setFirstName:、primitiveFirstName 和 setPrimitiveFirstName:”时,我会收到此错误。 ??
错误是编译错误,不是警告
我应该做一些特别的事情来生成原始访问器吗?
primitiveFullName
和 setPrimitiveFullName
肯定会在运行时自动生成。但是在编译时,编译器找不到这些方法。为了在调用这些方法时抑制编译错误,您应该声明这些方法的原型(prototype)。
如果在 2010 年时,Objective-C 编译器只表示警告以调用那些未声明的方法。但是在引入 ARC 之后,Objective-C 编译器不允许调用这种未声明的方法。
如下:
@interface Person (PrimitiveAccessors)
- (NSString *)primitiveFullName;
- (void)setPrimitiveFullNameNSString *)newName;
@end
@implementation Person (TransientProperties)
- (NSString *)fullName {
[self willAccessValueForKey"fullName"];
NSString *fullName = [self primitiveFullName];
[self didAccessValueForKey"fullName"];
if (fullName == nil) {
fullName = [NSString stringWithFormat"%@ %@", self.firstName, self.lastName];
[self setPrimitiveFullName:fullName];
}
return fullName;
}
@end
关于ios - 原始访问器没有可见的@interface,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29802367/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |