2016-07-23 3 views
3

У меня есть цель C API, определенный как это:Objc - Swift Взаимодействие: API Objc для любого типа?

- (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 с массивом быстры structs, но, к сожалению, я не могу отнести структуры к AnyObject. Есть ли способ написать API Objc с типом id, который переводит на быстрый тип Any, чтобы я мог использовать как класс быстрого действия, так и структуру?

+0

Это на самом деле будет в Swift 3: https://github.com/apple/swift-evolution/blob /master/proposals/0116-id-as-any.md –

ответ

3

Это невозможно, потому что NSArray может хранить только AnyObject, так как все они имеют одинаковый размер (1 указатель). Структуры с другой стороны имеют переменный размер (Bool имеет 1 байт, Int16 2 байта и т. Д.).

Свифт 3 принял предложение Import Objective-C id as Swift Any type, вероятно, сделать это возможным:

Нетипизированные коллекции какао входят в качестве коллекции 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, особенно то, как доступ к свойствам структуры работ, поскольку у меня нет опыта с этим.

EDIT: Вы можете использовать Lightweight Generics в Objective-C, так что NSArray<Box *> импортируется Свифта, как [Box]

+0

Маркировка класса @objc такая же, как наследование с помощью NSObject. Либо нужно делать! – Dershowitz123

+0

@ Dershowitz123 Спасибо! Полностью забыл –

Смежные вопросы