2014-06-14 13 views
20

W szybkiej grupy pochodzącej od ramy opartej na obj-C (ale może być równie dobrze szybkiej klasy z atrybutem @objc) I stwierdzenia, dwa zapisane właściwości:Czy Swift Opcjonalny Int (Int?) Może być wystawiony na działanie C poprzez mostowanie?

var optInt: Int? 
var optString: String? 

tylko Optstring jest narażone na Obiektu -C przez wygenerowany nagłówek -Swift.h.

Ciąg? jest prawdopodobnie w porządku, ponieważ jest odsłonięty za pomocą obiektu NSString, który może być zerowy, więc mostkowanie ma sposób reprezentowania żadnej wartości.

Po usunięciu? z optInt jest narażony na typ NSInteger, więc widzę, że dla nieobowiązkowych liczb całkowitych unika obiektów i łączy typ wartości do typu wartości, ale czy to dosłownie oznacza, że ​​Int? nie można ujawnić?

Nie mogę znaleźć żadnej dokumentacji, która wyraźnie mówi, że tak jest. Istnieje cała lista niekompatybilnych funkcji Swift, które nie pojawiają się w: Using Swift from Objective-C

W tym przypadku jest to klasyczna sytuacja wymagająca podania identyfikatora numerycznego, który może wynosić zero. W świecie przed-Swift NSNumber i nil są dokładnie tym, w jaki sposób zacząłem to implementować, ale po prostu źle się dzieje, gdy próbujesz przenieść klasę do Swifta, ale potem powracasz do typów Obj-C w klasie Swift specjalnie z tego powodu.

Przypuszczam, że przewidziałem, że Int? w przeciwieństwie do Int, most byłby w tle NSNumber, a jego potencjalnie zerowa wartość stanowi element "nie ma wartości" elementu opcjonalnego w Swift.

Czy czegoś tu brakuje? Aby powtórzyć, czy Swift Opcjonalny Int (Int?) Może zostać wystawiony na działanie C poprzez mostowanie?

+3

chciałbym spróbować 'NSNumber' z' intValue' wewnątrz. – dasblinkenlight

+1

Jeśli wygenerowany nagłówek nie robi czegoś z tą właściwością, wydaje się, że odpowiedź brzmi "nie". Ponieważ jednak Swift nie jest sfinalizowany, zgłasza błąd firmie Apple, jeśli uważasz, że istnieje rozsądne podejście. (Problem z ujawnieniem go jako 'NSNumber *' jest taki, że można zapisać do niego 'NSNumber 'kompatybilnego z' Innym '' z obiektu Objective-C.) –

+1

Możesz utworzyć obliczoną właściwość 'NSNumber? Własność. Getter po prostu zwróci zmienną 'Int?'. Seter ustawiłby zmienną 'Int' z' - [NSNumber integerValue] '. –

Odpowiedz

7

Problem z wystawiając nieruchomość Int? jak NSNumber* jest to, że można przechowywać niebędącą Int -Kompatybilny NSNumber do niego z Objective-C.

Możesz wykonać obliczoną właściwość NSNumber?, aby owinąć swoją właściwość Int?. Getter po prostu zwróci zmienną Int?. Seter ustawiłby zmienną Int z -[NSNumber integerValue].

5

Oto konkretny odpowiedź dla rozwiązania opisanego powyżej:

private var _number: Int? 
public var number: NSNumber? { 
    get { 
     return _number as NSNumber? 
    } 
    set(newNumber) { 
     _number = newNumber?.intValue 
    } 
} 

// In case you want to set the number in the init 
public init(number: NSNumber?) { 
    _number = number?.intValue 
} 
Powiązane problemy