目标 c 超类中的受保护变量在 swift 子类中不可访问

问题描述

@interface MyObjectiveCmainClass
{
@protected
    NSMutableArray* thisstringIsInaccessibleInSwiftSubclasses;//this I can't access in swift subclass
}
@property Nsstring* thisstringIsAccessibleInSwiftSubclasses;//this I can access in swift subclass
- (void) thisMethodisAccessibleInSwiftSubclasses;//this too I can access in Swift subclass
@end
class MySwiftSubclass : MyObjectiveCmainClass {
    
      override func thisMethodisAccessibleInSwiftSubclasses() {
         NSLog(self.thisstringIsAccessibleInSwiftSubclasses)
    }
}

知道为什么我无法访问我的 ObjectiveC 实例变量上的 @protected 属性吗?

解决方法

Swift 根本无法访问目标 C 实例变量,@protected 或其他。

实际上,Swift 根本没有公开实例变量的概念,只公开了属性。属性可以被计算或存储,但就 API 而言,它们只是属性。


这里的动机可能值得一提:它是为了允许图书馆进化的灵活性。一个库可以自由地改变它存储的值和它通过计算属性派生的值。例如。这样做可以实现更有效的内部陈述。但就客户而言,属性就是一个属性,与任何其他函数调用没有太大区别。他们不会遇到重大的 API 更改。

如果这些属性的间接性成为一个性能问题,您可以通过将您的类型标记为 @frozen 来解决它。属性 getter 可以内联到直接的 ivar 访问中,但这会暴露您类型的内部布局并限制您将来可以进行的更改(除非您决定进行重大更改)

,

正如亚历山大在他的回答中解释的那样,这不是“直接”可以实现的。

由于我不愿意改变目标C超类,我决定依靠KVC来实现我需要的。

 (value(forKey: "thisStringIsInaccessibleInSwiftSubclasses") as! NSString)//you now have access to the @protected instance variable 

然后我将创建一个主要的 swift 类并在其中完成所有 KVC 工作。