arrays - 从单例创建一个通用数组

标签 arrays swift generics generic-programming

我想用我的代码将我的数组变成通用的。说到泛型,我是新手。

这是我的代码:

class APIServices {
    static let youtubeBaseURL = "https://www.googleapis.com/youtube/v3/search"

    static let shared = APIServices()

    func fetchVideo(name: String, completionHandler: @escaping ([Item]) -> ()) {
        let apiKey = "mykey"
        let params = ["part": "snippet", "q": "tausiyah \(name)", "key": apiKey]

        Alamofire.request(APIServices.youtubeBaseURL, method: .get, parameters: params, encoding: URLEncoding.default, headers: nil).responseData { (dataResponse) in
            if let err = dataResponse.error {
                print("Failed to get data:", err)
                return
            }
            guard let data = dataResponse.data else { return }

            do {
                let youtubeData = try JSONDecoder().decode(YoutubeModel.self, from: data)

                completionHandler(youtubeData.items)
            } catch let decodeErr {
                print("Failed to decode youtube data:", decodeErr)
            }
        }
    }
}

这里是我的 YoutubeModel

struct YoutubeModel: Decodable {
var items: [Item]
}

struct Item: Decodable {
   var id: VideoId
   var snippet: Snippet
}

struct VideoId: Decodable {

var videoId: String

init(dictionary: [String: Any]) {
    self.videoId = dictionary["videoId"] as? String ?? ""
  }
}

struct Snippet: Decodable {

   func encode(with aCoder: NSCoder) {
      aCoder.encode(title, forKey: "titleStringKey")
   }

   var title: String
}

completionHandler: @escaping ([item]) 中,我想将其变成泛型。如何更改 JSONDecoder 下面的 completionHandler?

最佳答案

您可以尝试下面的通用实现,

public class YoutubeModel<T: Decodable>: Decodable {

    public var items: [T] = []
}

class APIServices {
    static let youtubeBaseURL = "https://www.googleapis.com/youtube/v3/search"

    static let shared = APIServices()

    func fetchVideo<T: Decodable>(name: String, of type: T.Type, completionHandler: @escaping ([T]) -> ()) {
        let apiKey = "mykey"
        let params = ["part": "snippet", "q": "tausiyah \(name)", "key": apiKey]

        Alamofire.request(APIServices.youtubeBaseURL, method: .get, parameters: params, encoding: URLEncoding.default, headers: nil).responseData { (dataResponse) in
            if let err = dataResponse.error {
                print("Failed to get data:", err)
                return
            }
            guard let data = dataResponse.data else { return }

            do {
                let youtubeData = try JSONDecoder().decode(YoutubeModel<T>.self, from: data)

                completionHandler(youtubeData.items)
            } catch let decodeErr {
                print("Failed to decode youtube data:", decodeErr)
            }
        }
    }
}

用法

APIServices.shared.fetchVideo(name: "name", of: Item.self) { list in
    print(list)
}

关于arrays - 从单例创建一个通用数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53292970/

相关文章:

基于返回类型的 Java 泛型转换?

swift - 为什么我不能在 Swift 中将可选数组转换为父类(super class)?

javascript - 使数组上的值匹配更快?

java - 如何将 JTable 保存和加载为 .txt 文件

ios - 如何修复使用前置摄像头镜像、AVFoundation、Swift 捕获图像

swift - XCode:无缝保留位置更新

java - 为什么我会在这里收到类型安全警告? (泛型)

c# - 如何从 C# 中具有相同类型的项目的数组返回对象?

java - 数组中的舍入单元格同时仍显示其未舍入副本的问题

swift - 值类型变量在传递给函数时如何被复制,这个副本是什么?