Objective c 使用重新声明的getter类型无法识别重新声明的属性
当我重新声明属性(只读->读写属性,协议->具体类型)时,我遇到了一个问题。在实现中使用getter时,我希望getter具有重新声明的类型,但它保留了原始类型 见示例: 福安 测试hObjective c 使用重新声明的getter类型无法识别重新声明的属性,objective-c,types,properties,redeclaration,Objective C,Types,Properties,Redeclaration,当我重新声明属性(只读->读写属性,协议->具体类型)时,我遇到了一个问题。在实现中使用getter时,我希望getter具有重新声明的类型,但它保留了原始类型 见示例: 福安 测试h #import <Foundation/Foundation.h> #import "Foo.h" @interface Test : NSObject @property (nonatomic, readonly) id<FooProtocol> foo; @end #导入 #导入“
#import <Foundation/Foundation.h>
#import "Foo.h"
@interface Test : NSObject
@property (nonatomic, readonly) id<FooProtocol> foo;
@end
#导入
#导入“Foo.h”
@接口测试:NSObject
@属性(非原子,只读)id foo;
@结束
Test.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
#导入“Test.h”
@接口测试()
@属性(非原子)Foo*Foo;
@结束
@实施测试
-(void)测试方法{
self.foo.additionalProperty;//此处错误:在“id”类型的对象上找不到属性“additionalProperty”
}
@结束
说到这里,我有两个问题:
我确实提出了一个可能的解决方法,声明了第二个属性,而不是重新声明原始属性,但我认为这不是最干净的,而且肯定会使代码更容易阅读: Test.m(带变通方法):
#导入“Test.h”
@接口测试()
@属性(非原子)Foo*foo2;
@结束
@实施测试
-(id)富{
返回self.foo2;
}
-(void)测试方法{
self.foo2.additionalProperty//无错误
}
@结束
丑陋(但情人眼里出西施),但它确实让编译器安静了下来:
- (void)testMethod
{
... _foo.additionalProperty ...;
}
这只是绕过foo
的getter,直接读取支持变量
从逻辑上讲,编译器不应该反对您的代码,但是Objective-C没有正式的定义,所以不能说它违反了Objective-C!不过,您可能希望向bugreport.apple.com提交一份报告你好???@realmofire是吗?这不是个坏主意。如果吸气剂有副作用,可能会变得易碎(并非吸气剂应该有副作用)=)
#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
#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 ...;
}