objective c super class 中的受保护变量在 swift subclass 中不可访问

Protected variable in an objective c super class is inaccessible in a swift subclass

@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 属性吗?

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

其实Swift根本没有暴露实例变量的概念,只有属性。可以计算或存储属性,但就 API 而言,它们只是属性。


可能值得一提的动机是:它允许库进化的灵活性。库可以自由地更改它存储的值和它通过计算属性派生的值。例如。这样做可以提高内部代表的效率。但就客户而言,属性 就是 属性,与任何其他函数调用没有太大区别。他们没有经历重大的 API 变化。

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

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

因为我不愿意改变objective C超级class,所以我决定依赖KVC来实现我需要的。

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

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