Optionale Werte von Nicht-Objective-C-Typen werden nicht in Objective-C überbrückt. Das heißt, die ersten drei Eigenschaften von TestClass
unter würden in Objective-C zur Verfügung, aber die vierten würde nicht:
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
}
In Ihrem Objective-C-Code, dann würden Sie diese ersten drei Eigenschaften zugreifen wie dies:
TestClass *optTest = [[TestClass alloc] init];
optTest.nsNumberOpt = @1.0;
optTest.nsNumberVar = @2.0;
optTest.doubleVar = 3.0;
In Ihrem Fall können Sie entweder konvertieren lat
und long
als nicht Optional oder schalten sie Instanzen von NSNumber
zu sein.
Beachten Sie, dass Sie über Ihre Objective-C-Code vorsichtig sein, wenn Sie den zweiten Ansatz (lat
und lon
zu nicht-optionalen Eigenschaften des Typs Schalt NSNumber
) - während der Swift-Compiler Sie verhindern wird aus Wenn der Objective-C-Compiler nil
nicht-optionalen Eigenschaften zuweist, hat er keine Bedenken, ihn zuzulassen. Werte nil
schleichen sich in Ihren Swift-Code ein, ohne dass sie zur Laufzeit abgefangen werden können. Betrachten Sie diese Methode auf 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)
}
}
Dies funktioniert gut, wenn mit den Werten in beide der Eigenschaften aufgerufen, aber wenn nsNumberVar
-nil
von dem Objective-C-Code festgelegt ist, wird diese zur Laufzeit zum Absturz bringen. Beachten Sie, dass keine Möglichkeit gibt, zu überprüfen, ob nsNumberVar
nil
ist, bevor Sie es verwenden!
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
Ich weiß nicht, weil in businessDetailViewController, ich habe auch einen Auslass '@IBOutlet var mapView: MKMapView ? 'und ich kann von außen darauf zugreifen, aber es hat keine' public' – tranvutuan
Ich denke, optionale Strukturen sind in Objective-C nicht sichtbar. Wird validiert. –