Soru hızlı init nesnel-C'de görünmez


Yaratmaya çalışıyorum init işlevler Swift ve örnekleri Objective-C. Sorun şu ki onu görmüyorum Project-Swift.h dosya ve başlatırken işlevi bulamıyorum. Aşağıda tanımlanan bir işlev var:

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

Koyarak bile denedim @objc(initWithUserId:) ve aynı hatayı tekrar almaya devam ediyorum. Kaybettiğim başka bir şey var mı? Kurucuyu nasıl görülebilir Objective-C Kod?

Bunun için aşağıdakileri okudum:

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

Swift'de Init yöntemi nasıl yazılır

Swift protokolünde isteğe bağlı yöntemler nasıl tanımlanır?


21
2017-10-20 16:47


Menşei




Cevaplar:


Gördüğünüz sorun, Swift'in isteğe bağlı değer türlerini birleştirememesidir - Int bir değer türü, bu yüzden Int! köprülenemez. İsteğe bağlı referans türleri (yani, herhangi bir sınıf) köprüler, her zaman olabileceğinden nil Hedef-C. İki seçeneğiniz, isteğe bağlı olmayan parametreyi yapmaktır, bu durumda ObjC'ye bir köprü olarak bağlanır. int veya NSInteger:

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

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

Ya da isteğe bağlı kullanın NSNumber!Bu isteğe bağlı olarak köprülenebilir.

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

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

Ancak, aslında, isteğe bağlı bir parametre gibi davranmıyorsunuz - self.userId ayrıca isteğe bağlı bir çalışma zamanı çökmesi için kendinizi bu şekilde ayarlıyorsunuz.


29
2017-10-20 18:32