gpt4 book ai didi

ios - 原始访问器没有可见的@interface

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:40:59 24 4
gpt4 key购买 nike

我正在尝试为一个简单的 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 的实现。

当我尝试编译该项目时,我收到此类别的错误消息“No visible @interface for 'Person' declares selector 'primitiveFullName'”。

当 Apple 文档说“例如,给定一个具有属性 firstName 的实体,Core Data 自动生成 firstName、setFirstName:、primitiveFirstName 和 setPrimitiveFirstName:”时,为什么我会收到此错误。 ??

错误是编译错误,不是警告

我是否应该使用一些特殊的东西来生成原始访问器?

最佳答案

primitiveFullNamesetPrimitiveFullName 肯定会在运行时自动生成。但是在编译时,编译器找不到这些方法。要在调用这些方法时抑制编译错误,您应该声明这些方法的原型(prototype)。

如果在 2010 年的时候,Objective-C 编译器只警告调用那些未声明的方法。但是在引入 ARC 之后,Objective-C 编译器不允许调用这种未声明的方法。

如下所示:

@interface Person (PrimitiveAccessors)

- (NSString *)primitiveFullName;
- (void)setPrimitiveFullName:(NSString *)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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com