当我重新声明一个属性(只读-> 读写属性和协议-> 具体类型)时,我遇到了一个问题。在实现中使用 getter 时,我希望 getter 具有重新声明的类型,但它保留了原始类型。
请参阅示例:
Foo.h
#import <Foundation/Foundation.h>
@protocol FooProtocol <NSObject>
@property (nonatomic) id someProperty;
@end
@interface Foo : NSObject <FooProtocol>
@property (nonatomic) id additionalProperty;
@end
Foo.m
#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
说了这么多,我有两个问题:
谁能向我解释为什么 foo getter 在实现中访问时不使用重新声明的类型?
有没有好的解决方案/解决方法:
A.修改Test.h中的接口(不想暴露更多,或者让接口更复杂)
B. 每当我使用 foo getter 时,它的结果都会被转换(不是很干净的代码)
非常感谢任何帮助,谢谢!
我确实提出了一种可能的解决方法,即声明第二个属性而不是重新声明原始属性,但我认为它不是最干净的,并且肯定会使代码更容易阅读:
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