Arrays 从singleton生成泛型数组
我想用我的代码将数组转换为泛型。说到泛型,我是新手 这是我的密码:Arrays 从singleton生成泛型数组,arrays,swift,generics,generic-programming,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]) ->
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)
}
}
}
}
您可以在
项目
@bestiosdeveloper的位置使用Any
,如果我使用Any,我应该向下广播吗?起初我认为最好使用泛型。感谢您的回复如果您可以将问题中的YoutubeModel
和Item
代码包括在内,那么它可以帮助您找到更好的解决方案。@Kamran,等等,我编辑问题了
APIServices.shared.fetchVideo(name: "name", of: Item.self) { list in
print(list)
}