gpt4 book ai didi

ios - swift 4 : "Non-nominal type ' T' does not support explicit initialization"

转载 作者:行者123 更新时间:2023-11-28 06:08:48 27 4
gpt4 key购买 nike

我正在使用这个扩展来在 urlSession 回调中检索 HTTP header :

extension HTTPURLResponse {

func get(_ header: String) -> String? {
let keyValues = allHeaderFields.map { (String(describing: $0.key).lowercased(), String(describing: $0.value)) }

if let headerValue = keyValues.filter({ $0.0 == header.lowercased() }).first {
return headerValue.1
}
return nil
}

}

这很好用,允许我像这样检索标题元素:

    if let metaInt = httpResponse.get("icy-metaint") {
self.icyMetaInt = Int(metaInt)
}

现在我想通过引入一个通用函数让它变得更优雅一点:

func getHeader<T>(_ httpResponse: HTTPURLResponse, _ headerName: String) -> T? {
guard let element = httpResponse.get(headerName) else {
return nil
}
return T(element)
}

目的是使用这样的语句:

self.icyMetaInt = getHeader(httpResponse, "icy-metaint")

我相信类似的东西可以在 C# 左右工作。但是 Swift 编译器提示:

Non-nominal type 'T' does not support explicit initialization

对于

return T(element)

即使我使用

return T.init(element) 

是否有机会实现我的想法?

编辑:添加了 T? (一定是编辑的时候丢了)

最佳答案

发生这种情况是因为编译器不知道应该调用哪个初始值设定项,因为您所做的事情太笼统了,如错误所述。您可以实现您想要实现的目标,但实现取决于您实现的目标。

简而言之,如果你希望能够初始化很多不同的类型,无论是原始类型还是对象,你应该定义一个新的协议(protocol),扩展每个类型以实现你认为合适的协议(protocol),并限制 T 类型到这个协议(protocol)。

示例:

protocol HTTPHeaderProtocol {
init(_ headerProtocolString: String?)
}

class MyCustomObject: HTTPHeaderProtocol {
var myString = ""
required init(_ headerProtocolString: String?) {
self.myString = headerProtocolString ?? ""
}

}

extension String: HTTPHeaderProtocol {
init(_ headerProtocolString: String?) {
self.init(headerProtocolString)
}
}

extension Int: HTTPHeaderProtocol {
init(_ headerProtocolString: String?) {
self.init(headerProtocolString)
}
}

extension HTTPURLResponse {

func get(_ header: String) -> String? {
let keyValues = allHeaderFields.map { (String(describing: $0.key).lowercased(), String(describing: $0.value)) }

if let headerValue = keyValues.filter({ $0.0 == header.lowercased() }).first {
return headerValue.1
}
return nil
}
func getHeader<T:HTTPHeaderProtocol>(_ httpResponse: HTTPURLResponse, _ headerName: String) -> T? {
guard let element = httpResponse.get(headerName) else {
return nil
}
return T(element)
}
}

这会起作用,希望能有所帮助:)

关于ios - swift 4 : "Non-nominal type ' T' does not support explicit initialization",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47348627/

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