如何从Swift扩展访问Objective-C类的私有成员?

时间:2014-10-26 12:20:26

标签: swift

我试图在Swift中扩展一个Obj-C类并使其符合Equatable协议。这需要访问扩展类的一些私有成员,编译器不允许这样做。如果不公开私人成员,这样做的正确方法是什么?

夫特:

import Foundation

extension ShortDate : Equatable {
}

public func == (lhs: ShortDate, rhs: ShortDate) -> Bool {
    if (lhs.components.year == rhs.components.year)
        && (lhs.components.month == rhs.components.month)
        && (lhs.components.day == rhs.components.day) {
            return true;
    }
    return false;
}

目标-C:

@interface ShortDate : NSObject<NSCopying, NSCoding> {
    NSDate           *inner;
    NSDateComponents *components; // The date split into components.
}

...

@end

错误:

  

ShortDate.swift:26:9:&#39; ShortDate&#39;没有名为&#39; components&#39;

的成员

2 个答案:

答案 0 :(得分:3)

我认为无法从Swift访问Objective-C实例变量。只有Objective-C属性才会映射到Swift属性。

答案 1 :(得分:0)

我试图找到一种方法来从我们使用的SDK之一访问类的私有变量时遇到了这个问题。由于我们没有或没有控制源代码,我们无法将变量更改为属性。我确实发现以下解决方案适用于这种情况:

extension ObjcClass {
    func getPrivateVariable() -> String? {
        return value(forKey: "privateVariable") as? String
    }

    open override func value(forUndefinedKey key: String) -> Any? {
        if key == "privateVariable" {
            return nil
        }
        return super.value(forUndefinedKey: key)
    }
}

覆盖value(forUndefinedKey:)是可选的。如果类中不存在私有变量,value(forKey:)将崩溃,除非您覆盖value(forUndefinedKey:)并提供默认值。