Objc - Swift互操作性:任何类型的Objc API?

时间:2016-07-23 02:27:01

标签: swift

我已经定义了这样的客观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类和结构体?

1 个答案:

答案 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]