括号内的Swift类型

4

今天我在玩Swift时,出现了一些奇怪的类型:

let flip = Int(random()%2)  //or arc4random(), or rand(); whatever you prefer

如果我在 Xcode 6 (Beta 2) 中输入 flip,自动补全会弹出,并且显示flip的类型为(Int),而不是Int

这很容易改变:

let flip : Int = Int(random()%2)
let flop = random()%2

现在flip和flop的类型是Int,而不是(Int)。更多操作后发现,这种“括号类型”是可以预测的,并且您可以通过在变量赋值的任何部分添加额外的括号来引起它们的出现。
let g = (5)      //becomes type (Int)

你甚至可以在类型中添加额外的括号!
let h = ((5))    //becomes type ((Int))
let k = (((5)))  //becomes type (((Int)))
//etc.

所以,我的问题是:这些括号类型(例如(Int))与类型Int有什么区别?


我测试了你的初始代码,它按照你的预期工作。无论我是否使用Int()都没有关系。因此,我无法重现你的观察结果。 - Jens Wirth
是的。我把它放回了游乐场,一切都很顺利。然而,我仍然不确定这些括号类型的目的是什么(因为它们仍然出现)。我将编辑掉那个介绍,直接问我的问题。 - cpimhoff
我认为这只是IDE的一个bug。(Int)Int是相同的。 - Bryan Chen
2个回答

6

部分原因是括号具有意义。

let g = (5)

这意味着g是一个包含一个Int的元组,符号为(Int)。它是(5,6)的单元素版本,符号为(Int,Int)

一般来说,在Swift中您需要非常小心括号;它们不能随意使用。它们有意义。

然而,这也部分是因为代码完成机制存在错误。如果您有可重现的情况,请向苹果公司报告。


2
如果括号内只有一个元素,则类型就是该元素的类型。例如,(Int) 的类型是 Int,而不是 (Int)。 - Bryan Chen
那就是出了故障的部分。我也看到过另一种情况:我有一个接受两个Int类型元组的函数,但代码补全将其视为接受两个Int类型。我还看到一些与类型声明有关的错误;例如,let x = Thing?[]()不能正常工作。 - matt
函数接受两个整数:(Int, Int) -> Void。函数接受包含两个整数的元组:((Int, Int)) -> Void。但我同意,与数组或可选项相比,元组非常令人困惑,它只是库类型的语法糖。我在库中找不到类似于 Tuple<Int, Int> 的东西。 - Bryan Chen
意味着 g 应该是由一个 Int 组成的元组。有一种只有一个元素的元组吗? - newacct
1
@BryanChen:“函数接受两个整数:(Int,Int)-> Void。函数接受包含两个整数的元组:((Int,Int)) -> Void。” 这两个是相同的。第一个函数也可以接受包含两个整数的元组;第二个函数也可以接受两个整数。 - newacct
显示剩余4条评论

3
据我所知,(Int)Int在类型上没有区别,可以任意书写。此处涉及到IT技术相关内容。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接