如何将Objective-C NSError指针传递给Swift函数?

Cha*_*kle 3 pointers objective-c nserror ios swift

我正在将Swift数据结构实现到Objective-C中,并且我很难"返回"2个值.

我的swift实现最初使用了一个元组来返回resultData和一个错误:

func getData(email: String) -> (SomeResultdata?, NSError?)
Run Code Online (Sandbox Code Playgroud)

但由于元组不是Objective-C中的一个特性,因此该函数不会暴露给Objective-C.我现在已经实现了一个专门用于返回SomeResultData的方法,但是也为传递的指针引用分配了一个NSError.见下文:

@objc func getData(email: String, var withError err: UnsafeMutablePointer<NSError?>) -> SomeResultdata? {
  let (credentials, error) = self.getData(email)
  // This self.getData(email) is the Swift implementation (returns tuple)
  err = &error
  return credentials
}
Run Code Online (Sandbox Code Playgroud)

我得到的两个错误是

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

和

无法将表达式的类型'()'转换为'inout $ T2'

rin*_*aro 6

例如NSJSONSerialization.dataWithJSONObject()有类似的模式:

class func dataWithJSONObject(obj: AnyObject, options opt: NSJSONWritingOptions, error: NSErrorPointer) -> NSData?
Run Code Online (Sandbox Code Playgroud)

是的NSErrorPointer.

typealias NSErrorPointer = AutoreleasingUnsafeMutablePointer<NSError?>
Run Code Online (Sandbox Code Playgroud)

所以你可以:

@objc func getData(email: String, withError err: NSErrorPointer) -> SomeResultdata? {
    let (credentials, error) = self.getData(email)
    // This self.getData(email) is the Swift implementation (returns tuple)
    err.memory = error
    return credentials
}
Run Code Online (Sandbox Code Playgroud)

至于AutoreleasingUnsafeMutablePointer,请参阅文档.