【问题标题】:How do you pass an Objective-C NSError pointer into a Swift function?如何将 Objective-C NSError 指针传递给 Swift 函数?
【发布时间】:2015-03-27 12:40:54
【问题描述】:

我正在将 Swift 数据结构实现到 Objective-C 中,但在“返回”2 个值时遇到了麻烦。

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

func getData(email: String) -> (SomeResultdata?, NSError?)

但是由于元组不是 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
}

我遇到的两个错误是

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

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

【问题讨论】:

    标签: ios objective-c swift pointers nserror


    【解决方案1】:

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

    class func dataWithJSONObject(obj: AnyObject, options opt: NSJSONWritingOptions, error: NSErrorPointer) -> NSData?
    

    我是NSErrorPointer

    typealias NSErrorPointer = AutoreleasingUnsafeMutablePointer<NSError?>
    

    所以你可以:

    @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
    }
    

    至于AutoreleasingUnsafeMutablePointer,见the documentation

    【讨论】:

    • 谢谢,不知道 .memory 属性。正是我让事情正常运转所需要的!
    猜你喜欢
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    • 2012-10-06
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    相关资源
    最近更新 更多