Swift,泛型函数:为什么需要一个参数标签,另一个不是?

时间:2015-12-25 19:54:10

标签: swift generics parameter-passing

Swift Playground具有此功能:

func repeatItem<Item>(item: Item, numberOfTimes: Int) -> [Item] {
    var result = [Item]()
    for _ in 0..<numberOfTimes {
         result.append(item)
    }
    return result
}
let strArray: [String] = repeatItem("knock", numberOfTimes:4) //!!!!

为什么函数调用中有numberOfTimes:,为什么删除它会给我错误&#34;缺少参数标签&#34;?更令人困惑的是,为什么要在&#34; knock&#34;中添加一个参数标签。给我&#34;无关的参数标签&#34;?

编辑:

这段代码在调用中也没有参数标签:

func anyCommonElements <T: SequenceType, U: SequenceType where T.Generator.Element: Equatable, T.Generator.Element == U.Generator.Element> (lhs: T, _ rhs: U) -> Bool {
    for lhsItem in lhs {
        for rhsItem in rhs {
            if lhsItem == rhsItem {
                return true
            }
        }
    }
   return false
}
anyCommonElements([1, 2, 3], [3])

2 个答案:

答案 0 :(得分:1)

func repeatItem<Item>(item: Item, numberOfTimes: Int) -> [Item] 是一个采用两个参数的方法,第一个是item,第二个是numberOfTimes。 在Swift中,当你调用一个方法或一个函数时,你必须写下参数的名称,后跟&#34;:&#34;及其价值。

在Swift中,可以省略第一个参数的名称。

答案 1 :(得分:1)

问题1

这是通过构建Swift。来自Swift language guide for functions - Function Parameter Names

  

默认情况下,第一个参数省略其外部名称,表示   第二个和后续参数使用其本地名称作为他们的   外部名称。所有参数必须具有唯一的本地名称。虽然   多个参数可以具有相同的外部名称,   独特的外部名称有助于提高代码的可读性。

     

...

     

如果您不想使用第二个或外部名称   函数的后续参数,改为写下划线(_)   该参数的显式外部名称。

请注意,您可以通过在第二个(及以后)参数名称前放置一个下划线_来取代此要求。在你的情况下:

func repeatItem<Item>(item: Item, _ numberOfTimes: Int) -> [Item] { ...

最后请注意,这与泛型无关,但通常与Swift函数无关。

问题2

尝试更换行

let strArray: [String] = repeatItem("knock", numberOfTimes:4) //!!!!

let strArray = [String](count: 4, repeatedValue: "knock")

这使用带有重复条目的数组对象的初始化。