【问题标题】:Call Swift function with parameters from Objective C class使用 Objective C 类中的参数调用 Swift 函数
【发布时间】:2019-03-08 09:14:51
【问题描述】:

我有一个用 swift 编写的库类,应该在我现有的 Objective-C 代码中使用。 我已经创建了桥接头并在 .h 中定义了 @class MySwiftClass 并在 .m 中导入“-Swift.h”

一个 swift 类与此类似

@objc class MySwiftClass: NSObject {
    var firstName : String
    var lastName: String

    public init(firstName: String, lastName: String) throws {
        guard !firstName.isEmpty && !lastName.isEmpty else { throw SOME_ERROR }
        self.firstName = firstName
        self.lastName = lastName
        super.init()
    }


func methodWithParams(city: String, suburb: String) throws -> String {
        return city + suburb
    }

我遇到了两个问题。

  1. 不知道如何在 Objective-c 类上调用 swift init 函数。我试过MySwiftClass *myClass = [MySwiftClass init];。至此,应用程序可以编译。但是不知道怎么传参数。

  2. 我也想在objective-c类中访问myClass.methodWithParams(city:"My city", suburb:"My country")

感谢您的帮助!

【问题讨论】:

  • 您需要做的第一件事是将@objc 添加到应在Objective-C 中可见的方法中。

标签: ios objective-c swift


【解决方案1】:
  1. 你必须在 init 调用之前调用 alloc。

    MySwiftClass* instance = [[MySwiftClass alloc] initWithFirstName: @"John" lastName: @"Doe"];
    
  2. 使用@objc 标记方法或使用@objcMembers 使您的方法可从Objective-C 代码公开。不幸的是,你不能在 Objective-C 中使用 throwable 初始化器。

    @objcMembers class MySwiftClass: NSObject {
        var firstName : String
        var lastName: String
    
        public init(firstName: String, lastName: String) throws {
            guard !firstName.isEmpty && !lastName.isEmpty else { throw SOME_ERROR }
            self.firstName = firstName
            self.lastName = lastName
            super.init()
        }
    
        func methodWithParams(city: String, suburb: String) throws -> String {
            return city + suburb
        }
    }
    

【讨论】:

  • 可以使用来自 Objective-C 的可抛出初始化器 - 签名只是有一个额外的 NSError ** error 参数
  • @lgzar 非常感谢您的详细回答。坚持下去。
【解决方案2】:

在 Objective-C 中实例化一个对象……

NSError *error = NULL;
MySwiftClass *class = [[MySwiftClass alloc] initWithFirstName: @"John"
                                                     lastName: @"Smith" 
                                                        error: &error]

调用方法

[class methodWithParamsWithCity: @"My CIty" suburb: @"My suburb" error: &error];

Swift 中的throws 在 Objective-C 中附加了一个 NSError ** error 参数

【讨论】:

  • 这里是[[MySwiftClass alloc] initWithFirstName:@"first" lastName:@"last" error:&error],因为init方法也会抛出。
  • 这是我在挖掘我 4 年前的 Objective-C 内存——我知道这一点,但在测试它没有编译时我觉得我快疯了。我想也许在我身边的 Obj-c 世界中发生了一些变化。这是丢失的@objc
  • 我接受 lgzar 的答案只是因为 @objcMembers.Sice 我不能接受两个答案,我给你的答案 +1,因为这两个答案都帮助我解决了问题。非常感谢
猜你喜欢
  • 2018-11-10
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多