重新声明的属性未被重新声明的类型识别为getter

时间:2018-03-22 08:06:04

标签: objective-c types properties redeclaration

当我重新声明属性时,我遇到了问题(readonly-> readwrite属性和protocol->具体类型)。在实现中使用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

Test.h

#import <Foundation/Foundation.h>
#import "Foo.h"

@interface Test : NSObject
@property (nonatomic, readonly) id<FooProtocol> foo;
@end

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

尽管如此,我有两个问题:

  1. 有人可以向我解释为什么foo getter在实现中访问时没有使用重新声明的类型吗?

  2. 有没有好的解决方案/解决方案 没有:

    一个。修改Test.h中的界面(我不想暴露更多,或使界面更复杂)

    B中。每当我使用它时都会抛出foo getter的结果(不是很干净的代码)

  3. 非常感谢任何帮助,谢谢!

    我确实提出了一个可能的工作,宣布第二个属性,而不是重新声明原始属性,但我不认为它是最干净的,并且肯定会让代码更难以阅读:

    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
    

1 个答案:

答案 0 :(得分:1)

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

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

这只是绕过了foo的getter并直接读取了支持变量。

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