如何在Swift 5.1(Xcode 11 Playground)中实现对可选函数的泛型和非泛型函数签名的重载?

g
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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在Xcode 11中删除Swift包依赖关系?

在Swift中从非泛型函数调用泛型函数

如何在 Xcode swift 5 中制作视频循环?

Xcode 11 Swift 5 CryptoKit共享SymmetricKey

java中的泛型函数如何实现?

Xcode 11 Beta 5中的API更改后,如何在SwiftUI中为TextField使用RoundedBorderTextFieldStyle?

如何在scala中实现一个泛型函数,该泛型函数可以添加和求和参数?

Swift 实现泛型函数

如何在 Xcode11 中的 Swift 中随机播放数组中的音频文件?

如何在Swift中调用歧义泛型函数?

Swift 中的泛型函数

如何编写采用泛型的泛型函数,该泛型实现了采用其他泛型的类

Swift 5(Xcode 11 Beta 5&6)-如何写入JSON文件?

如何在TS和TypeORM中创建泛型函数?

Swift 3泛型函数将数值限制在0和1的间隔内

分段错误:11-Xcode / Swift 5编译问题

XCODE 11,SWIFT5。绘图线,框等

NSCache,图像缓存,不缓存(Xcode 11,Swift 5)

Swift 5:使用 <T:BinaryInteger> 和 <T:BinaryFloatingPoint> 合并两个泛型函数并指定输出类型

如何在Apple Maps中更新路线-iOS 13.0中的Xcode Swift 5?

如何找到非泛型函数的来源?

如何在Xcode 11 Playground中使用图像?

泛型函数内部的Swift Equatable泛型类型比较

Swift协议继承和泛型函数

Java泛型函数:如何返回泛型类型

如何在Swift中表达约束泛型函数的类型?

如何在泛型函数类型中具有可选参数类型?

如何将float3转换为SIMD3 <Float>(Xcode 11 Swift 5使用float3和float4给出折旧警告)

如何在Swift 5中遍历字典?