目标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 根本无法访问 Objective C 实例变量,@protected否则无法访问。

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


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

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


以上是目标c超类中的受保护变量在swift子类中不可访问的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>