gpt4 book ai didi

Swift 通用 URLRequest

转载 作者:行者123 更新时间:2023-11-28 13:41:06 31 4
gpt4 key购买 nike

我正在尝试创建一个 createRequest 函数,我可以将其重新用于我的所有网络调用,有些需要发布 JSON 而其他则不需要,所以我正在考虑创建一个采用可选通用对象的函数;理论上是这样的:

struct Person: Codable {

var fName: String
var lName: String

}

struct Location: Codable {

var city: String
var state: String

}

let data = Person(fName: "John", lName: "Smith")
let location = Location(city: "Atlanta", state: "Georgia")

createRequest(withData: data)
createRequest(withData: location)

private func createRequest(withData:T) throws -> URLRequest {

var newRequest = URLRequest(url: URL(string: "\(withUrl)")!)

newRequest.httpMethod = method.rawValue

if let data = withData {

newRequest.setBody = data

}

if withAPIKey {

newRequest.setValue(apiKey, forHTTPHeaderField: "APIKEY")

}

return newRequest

}

我想返回 URLRequest,并可选择将不同的 JSON 对象传递给此函数。我读到你不能这样做,除非你在返回函数上定义类型,但我不能在返回中定义我的对象。

最佳答案

前言:这段代码是一团乱七八糟的缩进和不必要的空格(读起来像一篇双倍行距的文章,哈哈),我把它清理干净了。

看起来您的函数需要采用 T,但不仅仅是任何 T,而是一个被限制为 Encodable 的函数。这是一个常见的观察结果:更通用的泛型参数与更多类型兼容,但我们能做的却更少。通过将 T 包含到 Encodable 中,我们可以将其与 JSONEncoder.encode 一起使用。

标签 withData: 用词不当,因为该参数的类型不是 Data。像 withBody: 这样的东西会更好。

import Foundation

struct Person: Codable {
var fName: String
var lName: String
}

struct Location: Codable {
var city: String
var state: String
}

// stubs for making compilation succeed
let apiKey = "dummy"
let withAPIKey = true
enum HTTPMethod: String { case GET }

private func createRequest<Body: Encodable>(method: HTTPMethod, url: URL, withBody body: Body) throws -> URLRequest {

var newRequest = URLRequest(url: url)
newRequest.httpMethod = method.rawValue

newRequest.httpBody = try JSONEncoder().encode(body)

if withAPIKey {
newRequest.setValue(apiKey, forHTTPHeaderField: "APIKEY")
}

return newRequest
}

let data = Person(fName: "John", lName: "Smith")
let location = Location(city: "Atlanta", state: "Georgia")

关于Swift 通用 URLRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56014636/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com