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

8

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

我的Swift代码:

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;
}

Objective-C:

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

...

@end

我收到的错误信息:

ShortDate.swift:26:9:“ShortDate”没有名为“components”的成员


提示:这是一个与“ShortDate”类中缺少“components”成员相关的错误。

你是否在Swift的头文件 YourAppName-Bridging-Header.h 中添加了正确的头文件? - Maxim Shoustin
是的,桥接头已经就位,我可以在我的 Swift 代码中使用 ShortDate 类。我只想添加比较运算符而不是成员函数。 - Mike Lischke
2个回答

7

在尝试查找一种访问我们使用的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(forUndefinedKey:)并提供了默认值,否则value(forKey:)将在类上不存在私有变量时崩溃。


5
我认为无法从Swift访问Objective-C实例变量。只有Objective-C属性可以映射为Swift属性。

看起来是这样的。我用属性解决了它。 - Mike Lischke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接