快速协议声明:参数标签?

时间:2016-07-17 06:45:57

标签: swift function syntax protocols

是否可以在协议中告知/声明函数参数标签(而不是函数参数名称)?

或者它总是在采用类型和/或扩展中完成吗?

1 个答案:

答案 0 :(得分:1)

声明协议时,必须声明函数的参数。这是当您选择函数的参数/数量时,而不是稍后。

协议就像合同。在使用之前已经确定了绑定部分。

当一个对象符合协议时,它必须在你声明它们时使用它的功能,没有添加/更改/删除参数的选项。

使用这样的协议,例如:

protocol Juggling {

    func juggle(object: String, number: Int)

    func launch(object: String, howMany number: Int)

}

符合协议的对象必须使用声明的函数:

struct Juggler: Juggling {

    let name: String

    func juggle(object: String, number: Int) {
        print("Juggling \(number) x \(object)")
    }

    func launch(object: String, howMany number: Int) {
        print("Launching \(number) x \(object)")
    }

}

在来电方面,你必须宣布他们:

let joe = Juggler(name: "Joe")
joe.launch(object: "baton", howMany: 2)
joe.juggle(object: "ball", number: 5)

例如,你不能在调用者方面使用带有“number”而不是“howMany”的launch方法,它将不再符合协议。

使用协议扩展时的规则相同:

protocol Juggling {

    func juggle(object: String, number: Int)

    func launch(object: String, howMany number: Int)

}

extension Juggling {

    func juggle(object: String, number: Int) {
        print("Juggling \(number) x \(object)")
    }

    func launch(object: String, howMany number: Int) {
        print("Launching \(number) x \(object)")
    }

}

struct Juggler: Juggling {

    let name: String

}

let joe = Juggler(name: "Joe")
joe.launch(object: "baton", howMany: 2)
joe.juggle(object: "ball", number: 5)

例如,如果您尝试使用

joe.launch(object: "baton", number: 2) 

而不是

joe.launch(object: "baton", howMany: 2)
在调用者方面,Xcode实际上会显示修复信息,并建议更换参数名称。