I valori facoltativi dei tipi non-Objective-C non vengono sottoposti a ponte in Objective-C. Cioè, le prime tre proprietà di TestClass
sotto sarebbero essere disponibile in Objective-C, ma il quarto non sarebbe:
class TestClass: NSObject {
var nsNumberVar: NSNumber = 0 // obj-c type, ok
var nsNumberOpt: NSNumber? // optional obj-c type, ok
var doubleVar: Double = 0 // bridged Swift-native type, ok
var doubleOpt: Double? // not bridged, inaccessible
}
Nel codice Objective-C, che ci si accede a questi primi tre immobili come questo:
TestClass *optTest = [[TestClass alloc] init];
optTest.nsNumberOpt = @1.0;
optTest.nsNumberVar = @2.0;
optTest.doubleVar = 3.0;
Nel tuo caso, è possibile convertire lat
e long
essere non facoltativa o passare loro di essere casi di NSNumber
.
Si noti che è necessario essere attenti a vostro codice Objective-C se si prende il secondo approccio (commutazione lat
e lon
per immobili non opzionali di tipo NSNumber
) - mentre il compilatore Swift vi impedirà assegnando nil
a proprietà non opzionali, il compilatore Objective-C non ha remore a permetterlo, lasciando che i valori di nil
si introducano nel codice Swift senza possibilità di catturarli in fase di runtime. Considerate questo metodo su TestClass
:
extension TestClass {
func badIdea() {
// print the string value if it exists, or 'nil' otherwise
println(nsNumberOpt?.stringValue ?? "nil")
// non-optional: must have a value, right?
println(nsNumberVar.stringValue)
}
}
Questo funziona bene se invocato con valori in entrambe le proprietà, ma se nsNumberVar
è impostato su nil
dal codice Objective-C, questo andrà in crash in fase di esecuzione. Nota che c'è non c'è modo di controllare se nsNumberVar
è o meno nil
prima di usarlo!
TestClass *optTest = [[TestClass alloc] init];
optTest.nsNumberOpt = @1.0;
optTest.nsNumberVar = @2.0;
[optTest badIdea];
// prints 1, 2
optTest.nsNumberOpt = nil;
optTest.nsNumberVar = nil;
[optTest badIdea];
// prints nil, then crashes with an EXC_BAD_ACCESS exception
non so perché in businessDetailViewController, ho anche una presa '@IBOutlet var MapView: MKMapView ? 'e posso accedervi dall'esterno ma non ha' public' – tranvutuan
Penso che le strutture opzionali non siano visibili in Objective-C. Convaliderà. –