Swift, generic function : Why is one argument label needed, 其他的是不是?

标签 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:,为什么删除它会给我错误“缺少参数标签”?更令人困惑的是,为什么向“敲门”添加参数标签会给我“无关的参数标签”?

编辑:

此外,这段代码在调用中没有参数标签:

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])

最佳答案

问题一

这是通过 Swift 的构造实现的。来自 Swift language guide for functions - Function Parameter Names :

By default, the first parameter omits its external name, and the second and subsequent parameters use their local name as their external name. All parameters must have unique local names. Although it’s possible for multiple parameters to have the same external name, unique external names help make your code more readable.

...

If you do not want to use an external name for the second or subsequent parameters of a function, write an underscore (_) instead of an explicit external name for that parameter.

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

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

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


问题二

尝试更换你的线路

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

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

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

关于Swift, generic function : Why is one argument label needed, 其他的是不是?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34465919/

相关文章:

ios - 如何以编程方式在 UIPageViewController 中放置自动布局约束?

ios - 如何在自动布局 ios 中将 View 的底部边缘和顶部边缘约束到另一个 View ?

对具有泛型参数的方法的 Java 方法引用

javascript - 如何将变量传递给另一个php文件?

创建线程 - 传递参数

ios - iOS 无法打开相机

swift - 在 iOS 10/macOS Sierra Core Data 中调用新的 entity() 方法时出现 EXC_BAD_ACCESS

kotlin - 是否可以传递 null 类型来代替泛型类型参数?

generics - 在构造函数中使用模板类

matlab - 在 Matlab 中的函数之间共享 "many"变量