gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 05:33:33 26 4
gpt4 key购买 nike

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

class BusinessDetailViewController: UIViewController {

var lat : Double?
var lon : Double?

// Other elements...
}
在另一个 View Controller 中,我正在尝试访问 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 */
}
而我得到

Property 'lat' not found on object of type 'BusinessDetailViewController *'


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

最佳答案

非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的实例。

请注意,如果您采用第二种方法(将 latlon切换为 NSNumber类型的非可选属性),则需要谨慎对待Objective-C代码-而Swift编译器将阻止您将 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)
}
}

如果在两个属性中都使用值调用此方法,则效果很好,但是如果将objt_code从Objective-C代码设置为 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

关于objective-c - 无法从Objective-C访问Swift类型的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48031353/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com