使用 getter 的重新声明类型无法识别重新声明的属性



当我重新声明一个属性(只读>读写属性和协议>具体类型)时,我遇到了问题。在实现中使用 getter 时,我希望 getter 具有重新声明的类型,但它保留了原始类型。

请参阅示例:

福.h

#import <Foundation/Foundation.h>
@protocol FooProtocol <NSObject>
@property (nonatomic) id someProperty;
@end
@interface Foo : NSObject <FooProtocol>
@property (nonatomic) id additionalProperty;
@end

福米

#import "Foo.h"
@implementation Foo
@end

测试.h

#import <Foundation/Foundation.h>
#import "Foo.h"
@interface Test : NSObject
@property (nonatomic, readonly) id<FooProtocol> foo;
@end

测试.m

#import "Test.h"
@interface Test ()
@property (nonatomic) Foo *foo;
@end
@implementation Test
- (void)testMethod {
self.foo.additionalProperty; // Error here: Property 'additionalProperty' not found on object of type 'id<FooProtocol>'
}
@end

综上所述,我有两个问题:

  1. 谁能向我解释为什么 foo getter 在实现中访问时不使用重新声明的类型?

  2. 是否有任何好的解决方案/解决方法,没有:

    A.在Test.h中修改接口(我不想暴露更多,或者让界面更复杂)

    B.每当我使用它时,都会转换foogetter的结果(不是很干净的代码)

任何帮助都非常感谢,谢谢!


我确实想出了一个可能的方法,即声明第二个属性而不是重新声明原始属性,但我认为它不是最干净的,并且肯定会使代码更混乱:

Test.m(带解决方法):

#import "Test.h"
@interface Test ()
@property (nonatomic) Foo *foo2;
@end
@implementation Test
- (id<FooProtocol>)foo {
return self.foo2;
}
- (void)testMethod {
self.foo2.additionalProperty // No error
}
@end

丑陋(但美在旁观者的眼中),但它确实使编译器安静下来:

- (void)testMethod
{
... _foo.additionalProperty ...;
}

这只会绕过 getter 进行foo并直接读取支持变量。

从逻辑上讲,编译器不应该反对你的代码,但是没有Objective-C的正式定义,所以不能说它违反了它!但是,您可能希望向 bugreport.apple.com 提交报告

相关内容

  • 没有找到相关文章

最新更新