【问题标题】:Objective C Array completionHandler used in SwiftSwift 中使用的 Objective C 数组完成处理程序
【发布时间】:2016-11-17 13:16:50
【问题描述】:

我在一个用 Objective C 编写的框架中有一个完成处理程序...

这是块类型的 typedef。它需要一个 PHError 数组。

typedef void (^PHBridgeSendErrorArrayCompletionHandler)(NSArray *errors);

当我尝试在 Swift 中使用它时,我正在做......

 anObject.aMethod(completionHandler: { (errors: [ AnyObject?]) -> () in

 ...rest of code
 }

但我不断收到此错误:

无法将类型 '([AnyObject?]) -> ()' 的值转换为预期的参数类型 'PHBridgeSendErrorArrayCompletionHandler!'

谁能帮忙,我很困惑,看起来它应该对我有用。

【问题讨论】:

    标签: objective-c swift


    【解决方案1】:

    或者更好的是,您仍然可以将typedef 用作typealias

    定义

    typealias PHBridgeSendErrorArrayCompletionHandler = (_ errors: [Error]?) -> Void
    

    实施

    func myFunctionWithErrorCompletion(completion: PHBridgeSendErrorArrayCompletionHandler) {
    
        // Define empty array to add errors to
        var errors:[Error]?
    
        // Do Your Logic that may store errors to array
    
        // Completion and pass errors
        completion(errors)
    }
    

    用法

    func anotherOfMyFunctions() {
    
        // Call the function
        myFunctionWithErrorCompletion { (errors) in
    
            if let completionErrors = errors {
                // React to errors
            }
        }
    }
    

    【讨论】:

      【解决方案2】:
      anObject.aMethod(completionHandler: { (errors: [ AnyObject?]) -> () in 
      } 
      

      应该是

      anObject.aMethod() { errors in 
      } 
      

      为了更深入地挖掘,我必须知道PHBridgeSendErrorArrayCompletionHandler是什么

      【讨论】:

      • 感谢您的帮助。我在问题中发布的框架中唯一可用的定义是 typedef void (^PHBridgeSendErrorArrayCompletionHandler)(NSArray *errors);
      • 也不需要使用。闭包推断类型,所以给它一个名字是我的例子中唯一的要求。如果您想明确说明它是什么类型,Any 将起作用,因为我相信所有对象都是 any 类型。 NSArray 是官方类型,我不确定哪些 Arrays 被确定为 NSArray 类型。
      【解决方案3】:

      所以我的朋友通过简单地将 AnyObject 更改为 Any 解决了这个问题

      (错误:[任何]?)在

      这让我感到困惑,因为 NSArray 中的所有对象都是对象!所以没想到要尝试任何。

      我对 Swift 很陌生

      【讨论】:

        【解决方案4】:

        试试这个..

        anObject.aMethod(completionHandler: { (errors:NSArray?) -> () in
        
         ...rest of code
         }
        

        【讨论】:

        • 谢谢。我也已经尝试过了,但我得到...无法将类型“(NSArray?)->()”的值转换为预期的参数类型“PHBridgeSendErrorArrayCompletionHandler!”
        • 什么是PHBridgeSendErrorArrayCompletionHandler??? cmd 单击它并显示定义。
        • 还有 anObject.aMethod(completionHandler: { (errors: [ AnyObject?]) -> () in } 应该是 anObject.aMethod() { errors in }
        • cmd 点击显示没有定义。 typedef void (^PHBridgeSendErrorArrayCompletionHandler)(NSArray *errors);在 Objective-C 标头中是唯一需要通过的信息。此问题已通过将 AnyObject 替换为 Any 得到解决。感谢您的帮助
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多