【问题标题】:Protected variable in an objective c super class is inaccessible in a swift subclass目标 c 超类中的受保护变量在 swift 子类中不可访问
【发布时间】:2021-09-15 04:48:39
【问题描述】:
@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 属性吗?

【问题讨论】:

    标签: ios swift objective-c xcode language-interoperability


    【解决方案1】:

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

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


    可能值得一提的动机是:它允许库发展的灵活性。库可以随意更改它存储的值与通过计算属性派生的值。例如。可以这样做以允许更有效的内部表示。但就客户而言,属性就是属性,与任何其他函数调用都没有太大区别。他们不会经历重大的 API 更改。

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2014-05-14
        • 2013-05-27
        • 2023-01-13
        • 2014-04-04
        • 2017-01-12
        • 2013-06-20
        • 2017-12-09
        • 2012-12-01
        • 1970-01-01
        相关资源
        最近更新 更多