Swift中的元组和函数参数

Swift中的元组和函数参数,swift,tuples,Swift,Tuples,在Swift中,元组如何与函数参数相关 在以下两个示例中,函数返回相同的类型,即使其中一个接受一个元组,而另一个接受两个参数。从调用方的角度(不看代码),函数采用元组还是常规参数没有区别 函数参数在某些方面与元组相关吗 e、 g 在常规函数(而不是返回函数)的函数参数中声明元组时,行为也存在不一致: 更新: Chris Lattner对tuple的澄清: “x.0”,其中x是标量值,由于奇数,产生该标量值 涉及标量和变量之间过度隐式转换的行为 元组。这是一个需要修复的错误 在“let x=(y)

在Swift中,元组如何与函数参数相关

在以下两个示例中,函数返回相同的类型,即使其中一个接受一个元组,而另一个接受两个参数。从调用方的角度(不看代码),函数采用元组还是常规参数没有区别

函数参数在某些方面与元组相关吗

e、 g

在常规函数(而不是返回函数)的函数参数中声明元组时,行为也存在不一致:

更新:

Chris Lattner对tuple的澄清:

“x.0”,其中x是标量值,由于奇数,产生该标量值 涉及标量和变量之间过度隐式转换的行为 元组。这是一个需要修复的错误

在“let x=(y)”中,x和y具有相同的类型,因为(x)是 括号(即分组)运算符的语法,而不是元组 编队操作员。没有单一元素这样的东西 未标记的元组值

在“(foo:42)”中-最常见于参数列表中- 您正在生成一个带有元素标签的元素元组。 编译器目前正在努力消除它们并将其降级 将它们转换为标量,但不一致(这也是一个bug)。 也就是说,标记为元组的单个元素是一件事


每个函数只接受一个包含函数参数的元组。这包括不带参数的函数,这些函数将
()
-空元组-作为其一个参数

以下是Swift编译器如何将各种paren形式转换为内部表示形式:

() -> Void
(x) -> x
(x, ...) -> [Tuple x ...]
而且,如果有一个
tuple?
函数,它将在以下时间返回true:
Void
X
[tuple X…]

这是你的证据:

let t0 : () = ()
t0.0 // error

let t1 : (Int) = (100)
t1.0 -> 100
t1.1 // error

let t2 : (Int, Int) = (100, 200)
t2.0 -> 100
t2.1 -> 200
t2.2 // error
[粗体说明,目前无可访问的Swift口译员。]

但是,等等,你会问,如果我传递的不是一个元组呢? 好吧,我回答(用一种深沉的哲学语调),什么才是真正的 如果不是一个元素的元组,则为变量?Swift中的每个变量都是一个 事实上,每个非元组变量都有一个.0属性 这个变量的值。4打开一个游乐场,试试看。如果 将非元组变量传递到TupleCollectionView,这是合法的 如果你不相信,请阅读 这个理由再一次出现在一个听起来很真实的人的声音中 自信


记住我们已经到达“我说土豆;你说土豆”阶段时的“哲学语调”。

Swift中的函数将一个元组作为参数,可以包含零个或多个值。无参数函数获取一个没有值的元组,有一个参数的函数获取一个有1个值的元组,等等

您可以通过单独传递参数或将参数分组为不可变元组来调用函数。例如,所有这些调用都是等效的:

do {
    let t1 = testFunctionUsingTuple()
    let t2 = testFuncUsingArgs()

    let params = (1, "tuple test")

    t1(params)
    t1(2, "test")

    t2(params)
    t2(3, "test")
}

一个元组必须至少有两个元素。你不能有一个元素元组。一个函数可以接受一个参数,所以语句“Swift中的函数接受一个元组作为参数”是准确的吗?另外,我还发布了一个例子,说明常规func接受元组(与返回func)的行为不一致,这很有趣。
()
是一个元组-只是一个没有值的元组。元组中的最小值数是零,而不是两个-想想
(Int)->()
中的
:返回值是一个没有值的元组(即void)检查-搜索元组类型-元组类型是一个由零个或多个类型组成的逗号分隔列表,用括号括起来。-()没有特殊情况,空元组。但是
让x=1;打印(x.0)
有效,这意味着
x
既是
Int
又是tupleEvery类型,可以自动升级为包含该类型的一个tuple。这非常类似于每个类型都可以自动升级为该类型的可选类型。tuple和Optional仍然是类型;它们只有升级规则。空速级别ocity在这里做了一个很好的元组编写:情况似乎不是这样,因为你不能有一个元素元组,一个函数可以有一个参数。这是一个优化-一个X的元组就是X。所以一个X的元组不再是元组?反射(X)似乎是这样的。元组是一种实际类型,一个元素元组怎么会失去它的类型?检查。
oneSimple
变成
@Tv4main9oneSimpleSi
oneTuple
变成
@Tv4main8oneTupleSi
Si
Swift.Int
根据。没有
T
(=元组)。其中只有空元组(
T_
)或2个(或更多)元素
TSiSi_
emptyTuple
变为
@\u Tv4main10emptyTupleT
twoTuple
变为
@\u Tv4main8twoTupleTSiSi
@Boon它不是反汇编。它是SIL(Swit中间语言)和LLVM IR。只需将-emit sil或-emit IR传递给swiftc。编译包括几个阶段-Swift->Swift AST->sil->LLVM IR->assembly->binary。为什么。0?不知道原因,问Chris Lattner,但根据Rob链接的空速速度所写的文章,Swift中的每个变量都是1元组。事实上,每个非元组变量e有一个.0属性,它是该变量的值。我现在把它当作事实。在这个函数中
func funcUsingTuple(x:(Int,String))
必须显式传递一个元组:
funcUsingTuple((1,“test”))
@Antonio是的,我已经注意到了。问题是,当从函数返回相同的确切函数时,为什么我不需要这样做呢?(参见前面的示例)@恩,说真的,连一个与相关讨论相关的实质性答案都没有投赞成票吗?@GoZoner感谢提醒,仍然有持续的积极讨论。Upv
let t0 : () = ()
t0.0 // error

let t1 : (Int) = (100)
t1.0 -> 100
t1.1 // error

let t2 : (Int, Int) = (100, 200)
t2.0 -> 100
t2.1 -> 200
t2.2 // error
do {
    let t1 = testFunctionUsingTuple()
    let t2 = testFuncUsingArgs()

    let params = (1, "tuple test")

    t1(params)
    t1(2, "test")

    t2(params)
    t2(3, "test")
}