我正在尝试Double?从Objective-C 访问Swift类的属性。
Double?
class BusinessDetailViewController: UIViewController { var lat : Double? var lon : Double? // Other elements... }
在另一个视图控制器中,我尝试按lat以下方式进行访问:
lat
#import "i5km-Swift.h" @interface ViewController () @property (strong, nonatomic) BusinessDetailViewController *businessDetailViewController; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; self.businessDetailViewController = [[BusinessDetailViewController alloc] initWithNibName:@"BusinessDetailViewController" bundle:nil]; self.businessDetailViewController.lat = businessArray[1]; /* THIS GIVES ME AN ERROR */ }
而我得到
在类型’BusinessDetailViewController *’的对象上找不到属性’lat’
为什么我不能访问此属性?我想念什么?
非Objective-C类型的可选值不会桥接到Objective-C中。也就是说,前三个属性TestClass下面 会 是在Objective- C可用,但第四不肯:
TestClass
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 }
在Objective-C代码中,您将像这样访问前三个属性:
TestClass *optTest = [[TestClass alloc] init]; optTest.nsNumberOpt = @1.0; optTest.nsNumberVar = @2.0; optTest.doubleVar = 3.0;
你的情况,你可以转换lat和long是非可选或切换他们是实例NSNumber。
long
NSNumber
请注意,你需要,如果你采取第二种办法(开关要小心你的Objective-C代码lat和lon对类型的非可选属性NSNumber) -而斯威夫特编译器会阻止你分配nil到非可选特性,在Objective- C编译器对此毫无保留,允许nil值潜入您的Swift代码中,而没有机会在运行时捕获它们。考虑以下方法TestClass:
lon
nil
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) } }
如果在两个属性中都使用值来调用,则效果很好,但是如果从Objective-C代码nsNumberVar设置为nil,则在运行时会崩溃。请注意,有 没有办法检查 是否nsNumberVar是nil使用它之前!
nsNumberVar
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