8

我正在尝试在 Swift 中扩展一个 Objective-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:“ShortDate”没有名为“组件”的成员

4

2 回答 2

6

我在尝试找到一种从我们使用的 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:)并提供默认值,否则将崩溃。

于 2018-02-14T04:51:11.997 回答
5

我相信没有办法从 Swift 访问 Objective-C 实例变量。只有 Objective-C 属性被映射到 Swift 属性。

于 2014-10-28T00:24:31.507 回答