目标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超类的目标,我决定依靠KVC来实现我所需要的。

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

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

最新更新