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?
chciałbym spróbować 'NSNumber' z' intValue' wewnątrz. – dasblinkenlight
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.) –
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] '. –