在Objective-C中如何使用带有inout参数的Swift方法?

时间:2014-10-09 21:06:46

标签: objective-c swift

我想要

func foo(inout stop: Bool) -> Void {
    // ...
}

在我的Objective-C部分中使用。但它永远不会在Module-Swift.h头文件中生成。如果我用@objc标记它,

  

方法无法标记@objc,因为参数的类型不能   用Objective-C表示

发生错误。

2 个答案:

答案 0 :(得分:22)

在与Objective-C进行桥接时,您无法使用inout参数,但如果您使用UnsafeMutablePointer<T>,则可以执行类似操作(T将为{{1在你的情况下)。它看起来像这样:

Bool

实施例

TestClass.swift:

@objc func foo(stop: UnsafeMutablePointer<Bool>) -> Void {
    if stop != nil {
        // Use the .pointee property to get or set the actual value stop points to
        stop.pointee = true
    }
}

目标-C:

public class TestClass: NSObject {
    @objc func foo(stop: UnsafeMutablePointer<Bool>) -> Void {
        stop.pointee = true
    }
}

答案 1 :(得分:0)

与泛型发生的情况类似,inout不是objc兼容的。

一种可能的解决方法是将您的参数嵌入到一个类中(这是一个引用类型,因此通过指针而不是值传递):

@objc class MyFuncParams {
    var stop: Bool

    init(stop: Bool) {
        self.stop = stop
    }
}

并定义接受该类实例的函数:

func changeParam(params: MyFuncParams) {
    params.stop = true
}

不是解决问题的优雅方式,但重要的是它应该有效(尽管从未尝试过)。