Подтвердить что ты не робот

быстрый init не виден в объективе-C

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

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

Как написать метод Init в Swift

Как определить дополнительные методы в протоколе Swift?

4b9b3361

Ответ 1

Проблема, которую вы видите, заключается в том, что Swift не может связывать необязательные типы значений - Int является типом значения, поэтому Int! не может быть соединен Необязательные ссылочные типы (т.е. Любой класс) соединяются правильно, поскольку в Objective-C они всегда могут быть nil. Вы можете сделать два параметра необязательными, и в этом случае он будет соединен с 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 также не является необязательным, вы настраиваете себя таким образом на возможные сбои во время выполнения.