当前位置: 首页 > 面试题库 >

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

米景辉
2023-03-14
问题内容

我正在尝试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’

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


问题答案:

非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


 类似资料:
  • 问题内容: 使用最新的Xcode 9 Beta,我似乎完全无法访问Swift类的属性。更奇怪的是,我可以访问该类本身以实例化它或其他,但是完全无法访问它的属性。 因此,如果我有这个Swift类: 我尝试这样做: 我到底在做什么错?Xcode 9的新项目。 问题答案: 在Swift 4中更改了将Swift代码暴露给Objective-C的规则。请尝试执行以下操作: 作为一种优化,推断已在斯威夫特4.

  • 问题内容: 有一个Objective c基类: 和一个快速的子类: 我如何 从内部访问? 问题答案: 很棒的查询。我们已经尽力做到这一点。我找到的唯一可行的解​​决方案 通过使用获得价值 设定值使用 希望有帮助。在不更改超级类的情况下可能的解决方案。

  • 问题内容: 在Objective-C中,有一个称为的类方法,该方法在首次加载类时被调用。Swift中的等效项是什么? 问题答案: 在Swift 1.2之前: 编辑: 从Swift 1.2开始,您将无法再覆盖该方法。相反,查看该方法,它的行为与加载不同,它是在类第一次在某处而不是在应用程序初始加载时被调用的

  • 问题内容: 我有一个旧的Objective-C项目,我想调用新的Swift函数和对象,我已经创建了文件“ ”和“ ” 对我来说,从Swift调用函数到Objective-C很容易,但是我有一个反向问题。 因此,我创建了一个简单的类“ System.Swift” 现在我尝试按照此处和文件内的文档进行操作 并且已将其导入到Objective-C类中。此时,在我的Objective-C代码的Object

  • 问题内容: 我无法从Objective-C访问Swift Singleton。 swiftSharedInstance无法访问。 问题答案: 现在,我有以下解决方案。也许我忽略了一些使我能够直接访问“ swiftSharedInstance”的东西? 然后在ObjC中,我可以获取sharedInstance类方法(在导入xcode生成的swift标头绑定之后)

  • 本文向大家介绍Swift使用Objective-C代码中的Swift类,包括了Swift使用Objective-C代码中的Swift类的使用技巧和注意事项,需要的朋友参考一下 示例 在同一模块中 在名为“ MyModule ”的模块内,Xcode生成一个名为的标头,该标头MyModule-Swift.h将公共Swift类公开给Objective-C。导入此标头以使用Swift类: 相关的构建设置: