【发布时间】:2018-03-22 08:06:03
【问题描述】:
我在重新声明属性(只读-> 读写属性和协议-> 具体类型)时遇到了问题。在实现中使用 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
【问题讨论】:
-
你好??
-
@RealmOfFire 是吗?
标签: objective-c types properties redeclaration