我试图在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;
的成员
答案 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:)
并提供默认值。