属性 Swift class 中的字典类型对 Objective-C class 不可见

Property of type Dictionary in Swift class not visible to Objective-C class

我在 Objective-C 代码中使用 Swift class 时一直存在问题:

Swift class 看起来如下:

@objc class TestClass {
    private (set) var key:  UInt64
    private (set) var dict: [UInt64 : Double]! = [:]

    init(key: UInt64, value: Double) {
        self.key = key
        self.dict[key] = value
    }
}

当我尝试在 Objective-C 中使用 test.dict 时,编译器(在 Xcode 6.1.1 中)标记错误 Property 'dict' not found on object of type 'TestClass'.

奇怪的是生成的 MyProject-Swift.h 指的是 key 而不是 dict。以下是相关摘录:

@interface TestClass
@property (nonatomic, readonly) uint64_t key;
- (instancetype)initWithKey:(uint64_t)key value:(double)value OBJC_DESIGNATED_INITIALIZER;
@end

这适用于旧版本(我在 key 之后添加了 dict),但不再反映 Swift 中的定义。但是,问题似乎与构建步骤的顺序无关,因为如果我添加 属性 private (set) var key2: UInt64 它会显示在 MyProject-Swift.h 中。清理和重建项目无济于事(重启也无济于事 Xcode)。

在这种情况下,我的代码以及 Objective-C 和 Swift 之间的桥接有什么问题?难道是因为 dict 被定义为 Swift(不是 Objective-C 也不是 @objc)字典?如果是这样,我该如何重构代码才能取得进展。

如果我没记错的话,你的字典使用了不可映射到 Objective-C 的类型。

documentation 说:

When you cast [...] from a Swift dictionary to an NSDictionary object the keys and values must be instances of a class or bridgeable to an instance of a class.

您需要这样的声明:

private (set) var dict: [NSNumber: NSNumber]! = [:]

然后您的字典 属性 将出现在桥接头中。