我已经定义了这样的客观c API:
- (instancetype)initWithItems:(NSArray *)items reuseIdentifier:(NSString *)reuseIdentifier configuration:(void(^)(id item, id cell, NSIndexPath *indexPath))configuration;
这就像这样翻译成Swift:
public init!(items: [AnyObject]!, reuseIdentifier: String!, configuration: ((AnyObject!, AnyObject!, NSIndexPath!) -> Void)!)
现在,我想将此API与swift结构数组一起使用,但不幸的是我无法将结构转换为AnyObject
。有没有办法编写一个带有id
类型的Objc API,转换为swift类型Any
,以便我可以同时使用swift类和结构体?
答案 0 :(得分:3)
这是不可能的,因为NSArray
只能存储AnyObject
因为它们都具有相同的大小(1个指针)。另一方面,结构具有可变大小(Bool
具有1个字节,Int16
2个字节等。)
Swift 3接受的提案Import Objective-C id
as Swift Any
type可能会使这成为可能:
无类别的Cocoa集合作为
Any
的集合出现。NSArray
进口 作为[Any]
您现在可以编写一个简单的类包装器:
struct MyStruct {
let a : Int
let b : Int
}
final class Box : NSObject {
let value : MyStruct
init(value: MyStruct) {
self.value = value
}
}
let x = MyStruct(a: 1, b: 2)
let object : AnyObject = Box(value: x)
你必须自己测试它是否适用于ObjC,特别是如何访问struct属性,因为我没有任何经验。
编辑:您可以在Objective-C中使用Lightweight Generics,以便将NSArray<Box *>
导入到Swift中[Box]