import Foundation
enum Errors: Error {
case badParse
}
public typealias JSONDictionary = [String: Any]
public func decode(_ dictionary: JSONDictionary, key: String) throws -> URL {
guard let string = dictionary[key] as? String else {
throw Errors.badParse
}
if let url = URL(string: string) {
return url
}
throw Errors.badParse
}
public func decode<T>(_ dictionary: JSONDictionary, key: String) throws -> T {
guard let value = dictionary[key] else {
throw Errors.badParse
}
guard let attribute = value as? T else {
throw Errors.badParse
}
return attribute
}
let url: URL = try decode(["url":"test/url"], key: "url") // url: test/url
let urlOptional: URL? = try? decode(["url":"test/url"], key: "url") // nil
只要您解码的是NON-optional,上面的代码就可以工作。调用特定的非通用解码函数,并构造URL。
但是,如果您有一个可选的类型变量并对其进行解码,它将不会使用正确的函数。在swift 4.2中,可选参数和非可选参数都将使用正确的非泛型函数,但是自从我更新到Xcode 11 swift 5.1以来,就已经看到了这种现象。
任何帮助将不胜感激!
我宁愿不要使函数签名具有可选的返回值,例如
public func decode(_ dictionary: JSONDictionary, key: String) throws -> URL? {
因为它不具有可扩展性,而且以前没有它就可以工作。
显然,在Swift 5中类型推断的工作方式发生了一些变化。如果只希望它使用正确的重载,则只需稍加推动即可:
let urlOptional: URL? = try? decode(["url":"test/url"], key: "url") as URL
as URL
在末尾添加。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句