使用下面的代码,我得到" Type'(int,int)'不符合协议' IntegerLiteralConvertible'而不是像人们期望的那样错过参数。什么是IntegerLiteralConvertible,为什么你认为编译器会为下面的代码产生这个错误呢?
我已查看有关此错误的其他SO帖子,但尚未从中获得任何见解。
func add(x:Int, y:Int) {
}
add(3)
答案 0 :(得分:2)
我最好的猜测是它试图将(3)
元组转换为(Int, Int)
元组。
实际上,编译器已接受此操作并按预期工作:
func add(x: Int, y: Int) -> Int {
return x + y
}
let tuple = (4, 7)
add(tuple)
在输出11
的游乐场中,这是预期的总和结果。
注意:如果func是全局的,没有命名参数,则上面的代码可以正常工作。如果它是实例或类/静态方法,则元组必须包含参数名称:
class MyClass {
class func add(# x: Int, y: Int) -> Int {
return x + y
}
}
let tuple = (x: 3, y: 7)
MyClass.add(tuple) // returns 10
至于IntegerLiteralConvertible
,它用于使一个类或结构采用它来从一个文字整数进行初始化。让我们假设您有一个结构,并且您希望能够通过分配一个文字整数来实例化,您可以这样实现:
struct MyDataType : IntegerLiteralConvertible {
var value: Int
static func convertFromIntegerLiteral(value: IntegerLiteralType) -> MyDataType {
return MyDataType(value: value)
}
init(value: Int) {
self.value = value
}
}
然后你可以创建一个这样的实例:
let x: MyDataType = 5
答案 1 :(得分:0)
看起来你正在尝试使用currying - Swift内置了对此的支持,但它不是自动的,因此在声明你的函数时你必须明确它:
func add(x:Int)(y:Int) -> Int {
return x + y
}
println(add(3)) // (Function)