属性 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 的类型。
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]! = [:]
然后您的字典 属性 将出现在桥接头中。
我在 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 的类型。
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]! = [:]
然后您的字典 属性 将出现在桥接头中。