swift 为什么这段代码会创建循环引用?

v09wglhw  于 2023-03-28  发布在  Swift
关注(0)|答案(1)|浏览(149)

首先,谢谢你的帮助

for _ in 0..<v {
    let edge = readLine()!.split(separator: " ").map { Int(String($0))! }
    let (a: Int, b: Int, w: Int) = (edge[0], edge[1], edge[2]) 
}

在我看来,这只是接收整数并将其放入元组的过程,但检测到循环引用错误。你能告诉我为什么吗?

let edge = readLine()!.split(separator: " ").map { Int(String($0))! }
let (a, b, w) = (edge[0], edge[1], edge[2])

如果我删除类型注解,它会工作得很好。

nxagd54h

nxagd54h1#

这个错误有点不清楚,但是语法let (a: Int, b: Int, w: Int)对于声明元组中变量的类型是无效的。你实际上声明了3个名为Int的变量,没有类型。ab只是你可以通过continue abreak b引用的标签,除了这也会有问题,因为那些标签在元组内部。
您可以执行以下操作之一:

备选案文1

let (a, b, w): (Int, Int, Int) = (edge[0], edge[1], edge[2])
print(a, b, w)

这甚至不是一个元组-我们定义了3个独立变量-abw,都是Int类型

备选案文2

let x: (a: Int, b: Int, w: Int) = (edge[0], edge[1], edge[2])
print(x.a, x.b, x.w)

在本例中,我们定义了一个变量x,其类型为tuple,包含3个元素,分别标记为abw

选项2a:我们不妨这样做:定义一次类型

typealias MyType = (a: Int, b: Int, w: Int)

然后多次使用:

for _ in 0..<v {
    let edge = readLine()!.split(separator: " ").map { Int(String($0))! }
    let x: MyType = (edge[0], edge[1], edge[2]) 
}

相关问题