【问题标题】:Redeclared property not recognized with redeclared type for the getter重新声明的属性无法识别为 getter 的重新声明类型
【发布时间】: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

说了这么多,我有两个问题:

  1. 谁能向我解释为什么 foo getter 在实现中访问时不使用重新声明的类型?

  2. 是否有任何好的解决方案/解决方法没有:

    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


【解决方案1】:

丑陋(但情人眼中的美),但它确实让编译器安静下来:

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

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

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

【讨论】:

  • 这不是一个坏主意。如果吸气剂有副作用,最终可能会变脆(不是吸气剂应该有副作用)=)
猜你喜欢
  • 1970-01-01
  • 2018-11-09
  • 1970-01-01
  • 2016-03-07
  • 2013-08-07
  • 2011-03-22
  • 2023-03-29
  • 2016-02-24
  • 2018-02-16
相关资源
最近更新 更多