这个swift代码有什么问题?索引元组

这个swift代码有什么问题?索引元组,swift,indexing,tuples,Swift,Indexing,Tuples,我得到一个错误,说tuple nextxy没有成员1或2。我用了同样的语法,从一本书中抄了下来 var xypos: (Int, Int) = (x: 0, y: 0) var nextxy: (Int, Int) = (one: 1, two: 2) if x == 7 { nextxy.one = 0 } else if y == 63 { nextxy.two = 0 } 这就是在索引中获取值所需的操作 这就是在索引中获取值所需的操作 此代码是正确的: if x ==

我得到一个错误,说tuple nextxy没有成员1或2。我用了同样的语法,从一本书中抄了下来

var xypos: (Int, Int) = (x: 0, y: 0)

var nextxy: (Int, Int) = (one: 1, two: 2)

if x == 7 {
    nextxy.one = 0
} else if y == 63 {
    nextxy.two = 0
}
这就是在索引中获取值所需的操作

这就是在索引中获取值所需的操作

此代码是正确的:

if x == 7 {
    nextxy.0 = 0
} else if y == 63
    nextxy.1 = 0
}
如果希望通过实例访问元组

var xypos: (Int, Int) = (x: 7, y: 0)
var nextxy: (Int, Int) = (one: 1, two: 2)

if xypos.0 == 7 {
nextxy.0 = 0
} else if xypos.1 == 63 {
nextxy.1 = 0
}
print(xypos,nextxy)//xypos:7,0 nextxy:0,2
此代码是正确的:

if x == 7 {
    nextxy.0 = 0
} else if y == 63
    nextxy.1 = 0
}
如果希望通过实例访问元组

var xypos: (Int, Int) = (x: 7, y: 0)
var nextxy: (Int, Int) = (one: 1, two: 2)

if xypos.0 == 7 {
nextxy.0 = 0
} else if xypos.1 == 63 {
nextxy.1 = 0
}
print(xypos,nextxy)//xypos:7,0 nextxy:0,2

这也应该可以:

var xypos: (x: Int,y: Int) = (2,2)
var nexttxy:(one: Int,two: Int) = (1,2)
if xypos.x == 7 {
    nexttxy.one = 1
  }else{
    nexttxy.two = 0
 }
print(xypos,nexttxy)//xypos:(2,2) nexttxy:(1,0)

这也应该可以:

var xypos: (x: Int,y: Int) = (2,2)
var nexttxy:(one: Int,two: Int) = (1,2)
if xypos.x == 7 {
    nexttxy.one = 1
  }else{
    nexttxy.two = 0
 }
print(xypos,nexttxy)//xypos:(2,2) nexttxy:(1,0)

您正在强制将
nextxy
的类型设置为
(Int,Int)
,但您希望它的类型为
(一:Int,二:Int)
。元组标签是Swift中类型的一个薄弱部分,很容易丢失(一个原因是结构通常是比元组更好的工具)。Swift愿意根据需要添加或丢弃元组标签(在许多情况下,它们的行为基本上类似于注释)

如果您让类型推断完成它的工作(无论如何,您应该这么做),那么您将得到您想要的行为,不过:

var xypos: (x: Int, y: Int) = (x: 0, y: 0)

var nextxy: (one: Int, two: Int) = (one: 1, two: 2)

if xypos.x == 7 {
    nextxy.one = 0
} else if xypos.y == 63 {
    nextxy.two = 0
}

现在
nextxy
的类型是
(一:Int,二:Int)
,这是您所期望的。

您强制
nextxy
的类型是
(Int,Int)
,但您期望它是
(一:Int,二:Int)
。元组标签是Swift中类型的一个薄弱部分,很容易丢失(一个原因是结构通常是比元组更好的工具)。Swift愿意根据需要添加或丢弃元组标签(在许多情况下,它们的行为基本上类似于注释)

如果您让类型推断完成它的工作(无论如何,您应该这么做),那么您将得到您想要的行为,不过:

var xypos: (x: Int, y: Int) = (x: 0, y: 0)

var nextxy: (one: Int, two: Int) = (one: 1, two: 2)

if xypos.x == 7 {
    nextxy.one = 0
} else if xypos.y == 63 {
    nextxy.two = 0
}

现在
nextxy
的类型是
(一:Int,二:Int)
,这正是你所期待的。

伙计,我原以为元组标签、typedef、基于标签的索引等都是Swift非常酷的功能,但事实证明人们只是滥用它们作为结构替换。我明白为什么其他语言不包含这些特性。我认为更深层次的问题是Swift缺少匿名结构,这是一个非常常见的特性。anon结构和元组之间有什么区别?结构是无序的,并且在属性标签上是强类型的。Go称之为匿名结构(anonymous structs),这个名字在我看来最适合Swift,但其他语言,如SML、F#和Haskell称之为records。伙计,我认为元组标签、typedefs、基于标签的索引等都是Swift非常酷的功能,但事实证明人们只是滥用它们作为结构的替代品。我明白为什么其他语言不包含这些特性。我认为更深层次的问题是Swift缺少匿名结构,这是一个非常常见的特性。anon结构和元组之间有什么区别?结构是无序的,并且在属性标签上是强类型的。Go调用anonymous structs,这个名字在我看来最适合Swift,但其他语言如SML、F#和Haskell则称之为records。