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

Objective 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 #导入 #导入“

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

见示例:

福安

测试h

#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”
}
@结束
说到这里,我有两个问题:

  • 有人能向我解释为什么在实现中访问foo getter时不使用重新声明的类型吗

  • 没有:

    A.修改Test.h中的接口(我不想公开更多,或者使接口更复杂)

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

  • 非常感谢您的帮助,谢谢


    我确实提出了一个可能的解决方法,声明了第二个属性,而不是重新声明原始属性,但我认为这不是最干净的,而且肯定会使代码更容易阅读:

    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 ...;
    }