2014-10-20 2 views
18

Я пытаюсь создать init функции в Swift и создавать экземпляры с Objective-C. Проблема в том, что я не вижу его в файле Project-Swift.h, и я не могу найти функцию при инициализации. У меня есть функция, определенная как показано ниже:swift init не видно в objecitve-C

public init(userId: Int!) { 
    self.init(style: UITableViewStyle.Plain) 
    self.userId = userId 
} 

Я даже пытался положить @objc(initWithUserId:) и я продолжаю снова получаю ту же ошибку. Есть что-то еще, что мне не хватает? Как получить конструктор, видимый для Objective-C?

Я прочитал ниже этого:

https://developer.apple.com/library/ios/documentation/swift/conceptual/swift_programming_language/Initialization.html

https://developer.apple.com/library/ios/documentation/swift/conceptual/buildingcocoaapps/interactingwithobjective-capis.html

How to write Init method in Swift

How to define optional methods in Swift protocol?

ответ

26

вопрос, вы видите, что Swift не может преодолеть дополнительное значение типы - Int - тип значения, поэтому Int! не может быть соединен с мостом. Необязательные ссылочные типы (т. Е. Любой класс) правильно соединяются, так как они всегда могут быть nil в Objective-C. Ваши два варианта, чтобы параметр, не обязательно, в этом случае она будет мостик ObjC как int или NSInteger:

// Swift 
public init(userId: Int) { 
    self.init(style: UITableViewStyle.Plain) 
    self.userId = userId 
} 

// ObjC 
MyClass *instance = [[MyClass alloc] initWithUserId: 10]; 

Или использовать дополнительный NSNumber!, так что может быть устранена в качестве опции:

// Swift 
public init(userId: NSNumber!) { 
    self.init(style: UITableViewStyle.Plain) 
    self.userId = userId?.integerValue 
} 

// ObjC 
MyClass *instance = [[MyClass alloc] initWithUserId: @10]; // note the @-literal 

однако следует отметить, что вы на самом деле не обрабатывать параметр как дополнительный - если self.userId не также является необязательным, вы настраиваете себя на потенциальное выполнение врежется этим путем.