gpt4 book ai didi

swift - 元组比较是如何工作的

转载 作者:搜寻专家 更新时间:2023-10-31 22:04:07 24 4
gpt4 key购买 nike

let p1 = (name: "John", age:12)
let p2 = (color: "Red", size:12)


if p1 == p2 {
print("equal")
}else {
print("not equal")
}

我原以为这两个元组不兼容,因为参数名称不同,而且代码无法编译。但它工作正常。很想知道怎么做。

Swift 是否会根据属性类型自动创建 == 运算符,然后只做一个简单的 lhsrhs。是吗?

编辑:

func givePerson() -> (name: String, age: Int)? {
return ("alex", 2)
}

func extract() {
var p3 : (Name: String, age: Int)

if let person = giveName() as? (Name: String, age: Int) {
p3 = person
print(p3)
}else {
print("p3 not defined")
}

}

extract() // p3 not defined

我的extract 函数失败了,只是因为我得到的元数名称不正确。这也是意料之中的吗?这与元组比较有何不同?

最佳答案

标准库 defines tuple comparison operators对于 2 个元素元组,最多并包括 6 个元素元组。它通过使用元编程工具来做到这一点 GYB (生成样板)允许嵌入式 Python 代码从模板生成文件。

生成的元组比较运算符最终看起来像:

public func == <A, B>(lhs: (A, B), rhs: (A, B)) -> Bool

public func == <A, B, C>(lhs: (A, B, C), rhs: (A, B, C)) -> Bool

public func == <A, B, C, D>(lhs: (A, B, C, D), rhs: (A, B, C, D)) -> Bool

// ...

所以你的代码:

let p1 = (name: "John", age: 12)
let p2 = (color: "Red", size: 12)

if p1 == p2 {
print("equal")
} else {
print("not equal")
}

编译器会调用二元组比较运算符。您会注意到,没有一个定义的元组比较运算符使用元组标签作为它们的参数。之所以
(name: String, age: Int)(color: String, size: Int)都可以传给(A , B) 是编译器实现了一个隐式转换,可以去除元组的标签。因此,两个参数的标签都被剥离,并且都作为 (String, Int) 传递。

这就是使以下内容合法的原因:

let p1 = (name: "John", age: 12)
let p2: (String, Int) = p1 // Legal.

事情变得更奇怪了,因为编译器还有一个隐式转换,可以添加任意标签到元组:

let p1 = ("John", 12)
let p2: (foo: String, bar: Int) = p1 // Legal.

但是禁止直接重命名标签:

// Indirect renaming ✅
let p1 = (name: "John", age: 12)
let p2: (String, Int) = p1
let p3: (foo: String, bar: Int) = p2

// Put together ✅
let p4: (foo: String, bar: Int) = p1 as (String, Int)

// Direct renaming ❌
let p4 = (name: "John", age: 12)
let p5: (foo: String, bar: Int) = p4

这就是您在 as? 转换中看到的行为。像上面的例子一样,首先强制转换为未标记的表单:

func givePerson() -> (name: String, age: Int)? {
return ("alex", 2)
}

func extract() {
var p3: (Name: String, age: Int)
if let person = givePerson() as (String, Int)? as? (Name: String, age: Int) {
p3 = person
print(p3)
} else {
print("p3 not defined")
}

}

extract() // (Name: "alex", age: 2)

关于swift - 元组比较是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54872794/

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