为什么代码会产生错误Type'(int,int)'不符合协议' IntegerLiteralConvertible'

时间:2014-08-30 14:00:57

标签: swift

使用下面的代码,我得到" Type'(int,int)'不符合协议' IntegerLiteralConvertible'而不是像人们期望的那样错过参数。什么是IntegerLiteralConvertible,为什么你认为编译器会为下面的代码产生这个错误呢?

我已查看有关此错误的其他SO帖子,但尚未从中获得任何见解。

func add(x:Int, y:Int) {

}

add(3)

2 个答案:

答案 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)