Swift中的通用完成处理程序

漫步

我有一个名为的方法performRequest()它需要一个JSONRequest参数。JSONRequest看起来像这样:

public typealias JSONCompletionHandler = ([Entity]?, NSError?) -> Void

public class JSONRequest: Request {
    public var completionHandler: JSONCompletionHandler
    public var endPoint: String
}

而且performRequest()是这样的:

public func performJSONRequest<T where T: Entity>(jsonRequest: JSONRequest, _: Type) {
        // Make a request which returns a data object
        var entities = self.convertJSONData(data, jsonKey: jsonRequest.jsonKey, T.self)
        // Error: 'T' is not identical to 'Entity'
        jsonRequest.completionHandler(entities, error)
}

如您所见,它调用convertJSONData()如下所示:

func convertJSONData<T where T: Entity>(jsonData: AnyObject, _: T.Type) -> [T] {
        // Convert the data into Swift collection classes, enumerate over them, and create model objects
        var json = JSON(data: jsonData as NSData, options: nil, error: nil)
        var entities = [T]()

        for obj in json {
            let book = T(json: obj)
            entities.append(book)
        }

    return entities

实体是我所有模型类(例如AuthorBook)都遵守的协议

它定义了一种方法:init(json: JSON)由于T定义为T:Entity,因此我可以调用T:(json: obj)创建符合的任何类的实例Entity

我希望能够对符合Entity的任何对象performJSONRequest()执行请求例如,我要为这样的Book实例建立一个请求:

var request = JSONRequest(endPoint: "books") { (let object: [Entity]?, let error: NSError?) -> Void in
    // Cast object to [Book] and have fun
}

performJSONRequest<Book>(request)

我一生都无法找到实现该目标的方法。现在,我在performJSONRequest()方法提示中出现错误'T' is not identical to 'Entity'如果我在完成处理程序中定义数组,则[AnyObject]得到相同的错误:'T' is not identical to 'AnyObject'

谢谢你的帮助!

内特·库克(Nate Cook)

解决方案是将通用类型上移到JSONRequest类中-这种方式JSONCompletionHandler可以使用您要的通用类型定义,而不仅仅是Entity协议。(您的某些代码似乎有点伪,因此可能需要进行一些调整才能适合您的实现。)

JSONRequest现在是具有Entity类型约束的泛型类

public class JSONRequest<T: Entity>: Request {
    // completion handler defined in terms of `T`
    public typealias JSONCompletionHandler = ([T]?, NSError?) -> Void

    // no further changes        
    public var completionHandler: JSONCompletionHandler
    public var endPoint: String
    public init(endPoint: String, completionHandler: JSONCompletionHandler) {
        self.endPoint = endPoint
        self.completionHandler = completionHandler
    }
}

performJSONRequest不再需要将类型作为单独的参数传递。由于jsonRequest是专用的,因此它从该参数获取类型信息:

public func performJSONRequest<T: Entity>(jsonRequest: JSONRequest<T>) {
    // create array of `T` somehow 
    var entities: [T] = []
    var error: NSError?

    // completionHandler expects [T]? and NSError?
    jsonRequest.completionHandler(entities, error)
}

创建JSONRequest实例时,补全处理程序中提供的类型(例如[Book]?)将为generic设置类型JSONRequest,并在整个过程中保持:

var request = JSONRequest(endPoint: "books") { (books: [Book]?, error) in
    println(books?.count)
}
performJSONRequest(request)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用完成处理程序在Swift中调用连续动画

来自分类Dev

调用完成处理程序 Firebase Swift

来自分类Dev

Swift 4 tableview 未使用通用完成处理程序显示数据

来自分类Dev

在 Swift 中,如何在已经使用 One 的函数中使用完成处理程序?

来自分类Dev

Swift 3-未调用完成处理程序

来自分类Dev

Swift中的完成处理程序

来自分类Dev

Swift:阻塞mainThread,直到函数完成数据加载,并使用完成处理程序NSURLSession

来自分类Dev

未调用完成处理程序-iOS

来自分类Dev

未调用完成处理程序-iOS

来自分类Dev

在Swift中使用完成处理程序对图像进行动画处理

来自分类Dev

在目标C中使用完成处理程序调用Swift函数

来自分类Dev

如何在SKSpriteNode上的Swift中使用完成处理程序进行连续函数调用?

来自分类Dev

如何在iOS Swift中使用完成处理程序正确记录方法

来自分类Dev

Swift:使用完成处理程序从另一个通知一个ViewController

来自分类Dev

使用完成处理程序和DispatchSemaphore在Swift上进行异步请求

来自分类Dev

Swift-从第二个函数调用完成处理程序

来自分类Dev

如何在SKSpriteNode上的Swift中使用完成处理程序进行连续的函数调用?

来自分类Dev

在目标C中使用完成处理程序调用Swift函数

来自分类Dev

SKAction完成处理程序;Swift中的用法

来自分类Dev

完成处理程序中的Swift泛型

来自分类Dev

Swift中的完成处理程序错误

来自分类Dev

使用完成处理程序来处理对Firebase的调用的结果

来自分类Dev

在嵌套闭包中调用完成处理程序以停止递归函数

来自分类Dev

Gigya Facebook登录:未调用完成处理程序

来自分类Dev

didReceiveRemoteNotification:fetchCompletionHandler:但从未调用完成处理程序

来自分类Dev

如何使用完成处理程序正确消除模式ViewController

来自分类Dev

在while循环中使用完成处理程序

来自分类Dev

使用完成处理程序实现自定义 func

来自分类Dev

如何使用完成处理程序和参数调用函数

Related 相关文章

  1. 1

    使用完成处理程序在Swift中调用连续动画

  2. 2

    调用完成处理程序 Firebase Swift

  3. 3

    Swift 4 tableview 未使用通用完成处理程序显示数据

  4. 4

    在 Swift 中,如何在已经使用 One 的函数中使用完成处理程序?

  5. 5

    Swift 3-未调用完成处理程序

  6. 6

    Swift中的完成处理程序

  7. 7

    Swift:阻塞mainThread,直到函数完成数据加载,并使用完成处理程序NSURLSession

  8. 8

    未调用完成处理程序-iOS

  9. 9

    未调用完成处理程序-iOS

  10. 10

    在Swift中使用完成处理程序对图像进行动画处理

  11. 11

    在目标C中使用完成处理程序调用Swift函数

  12. 12

    如何在SKSpriteNode上的Swift中使用完成处理程序进行连续函数调用?

  13. 13

    如何在iOS Swift中使用完成处理程序正确记录方法

  14. 14

    Swift:使用完成处理程序从另一个通知一个ViewController

  15. 15

    使用完成处理程序和DispatchSemaphore在Swift上进行异步请求

  16. 16

    Swift-从第二个函数调用完成处理程序

  17. 17

    如何在SKSpriteNode上的Swift中使用完成处理程序进行连续的函数调用?

  18. 18

    在目标C中使用完成处理程序调用Swift函数

  19. 19

    SKAction完成处理程序;Swift中的用法

  20. 20

    完成处理程序中的Swift泛型

  21. 21

    Swift中的完成处理程序错误

  22. 22

    使用完成处理程序来处理对Firebase的调用的结果

  23. 23

    在嵌套闭包中调用完成处理程序以停止递归函数

  24. 24

    Gigya Facebook登录:未调用完成处理程序

  25. 25

    didReceiveRemoteNotification:fetchCompletionHandler:但从未调用完成处理程序

  26. 26

    如何使用完成处理程序正确消除模式ViewController

  27. 27

    在while循环中使用完成处理程序

  28. 28

    使用完成处理程序实现自定义 func

  29. 29

    如何使用完成处理程序和参数调用函数

热门标签

归档