gpt4 book ai didi

swift - 如何使结构可以从元组文字自动转换?

转载 作者:行者123 更新时间:2023-12-03 09:19:54 25 4
gpt4 key购买 nike

在Swift中,可以将某些文字自动转换为其他类型:

let _: Double = 1  // Int literal to Double variable

但是,对于结构,编译器拒绝执行类似的转换:
struct User {
var id: Int
var name: String
}

let _: User = (id: 778, name: "Pete") // error: cannot convert value of type '(id: Int, name: String)' to specified type 'User'

用相应的字段定义初始化程序也无济于事。

当从上下文中清除类型时,是否可以忽略结构的显式初始化程序?

最佳答案

在Swift中,唯一可用于实例化类型的文字是IntDoubleStringBoolArrayDictionary不允许使用元组。
Swift的目标是成为强类型语言,因此您应该使用:let user = User(id: 778, name: "Pete")它既明确又简短,并且不比您要查找的内容冗长。

但是,您可以使任何类型都符合ExpressibleBy<LiteralType>Literal。这是一种实现与元组初始化类似的行为的有趣方法:

struct User {
var id: Int
var name: String
}

extension Person: ExpressibleByDictionaryLiteral {
init(dictionaryLiteral elements: (String, Any)...) {
let elements = Dictionary(uniqueKeysWithValues: elements)
self.id = elements["id"]! as! Int
self.name = elements["name"]! as! String
}
}

let user: User = ["id": 778, "name": "Pete"]
这既不安全又效率低下。

一种更安全但不太方便的方法是使用静态工厂方法:
extension User {
static func t(_ tuple: (Int, String)) -> User {
User(id: tuple.0, name: tuple.1)
}
}

let user: User = .t((id: 778, name: "Pete"))

另一个有趣的事情是,在某些情况下,编译器将允许使用与要使用的初始化程序签名完全匹配的元组,例如,在使用 map时:
let persons = [(id: 778, name: "Pete")]
let users = persons.map(User.init)

关于swift - 如何使结构可以从元组文字自动转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39195664/

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