一尘不染

无法从Objective-C访问Swift类型的属性

swift

我正在尝试Double?从Objective-C 访问Swift类的属性。

class BusinessDetailViewController: UIViewController {

    var lat : Double?
    var lon : Double?

    // Other elements...
}

在另一个视图控制器中,我尝试按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’

为什么我不能访问此属性?我想念什么?


阅读 240

收藏
2020-07-07

共1个答案

一尘不染

非Objective-C类型的可选值不会桥接到Objective-C中。也就是说,前三个属性TestClass下面 是在Objective-
C可用,但第四不肯:

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;

你的情况,你可以转换latlong是非可选或切换他们是实例NSNumber


请注意,你需要,如果你采取第二种办法(开关要小心你的Objective-C代码latlon对类型的非可选属性NSNumber
-而斯威夫特编译器会阻止你分配nil到非可选特性,在Objective-
C编译器对此毫无保留,允许nil值潜入您的Swift代码中,而没有机会在运行时捕获它们。考虑以下方法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)
    }
}

如果在两个属性中都使用值来调用,则效果很好,但是如果从Objective-C代码nsNumberVar设置为nil,则在运行时会崩溃。请注意,有
没有办法检查 是否nsNumberVarnil使用它之前!

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
2020-07-07