Unable to overload function in viewDidLoad() in swift

匿名 (未验证) 提交于 2019-12-03 02:33:02

问题:

Unable to overload function in viewDidLoad() in swift. It gives error definition conflict with previous value" at "func joinString(#strings: String...) -> String {

override func viewDidLoad() {     super.viewDidLoad()     func joinString(#strings: String[]) -> String {             var str = ""              for s in strings {                 str += s             }             return str         }     func joinString(#strings: String...) -> String {             return joinString(strings: strings)         }     println(joinString(strings : ["I", "am", "an", "array"]))     println(joinString(strings : "I", "am", "an", "array")) } 

回答1:

This looks like a Swift bug (or an undocumented restriction) to me. Function/method overloading works generally, even with array vs variadic parameters:

class MyClass {      func foo(arg: Int) { println("An integer") }     func foo(arg: Double) { println("A double") }      func joinString(#strings: String[])  { println("An array") }     func joinString(#strings: String...)  { println("Variadic parameters")}      func test() {         foo(2)         foo(3.14)         joinString(strings : ["I", "am", "an", "array"])         joinString(strings : "I", "am", "an", "array")     } } 

and produces the expected output:

 An integer A double An array Variadic parameters 

But overloading does not work for nested functions:

class MyClass {      func test() {          func foo(arg: Int) { println("An integer") }         func foo(arg: Double) { println("A double") }         // error: definition conflicts with previous value          func joinString(#strings: String[])  { println("An array") }         func joinString(#strings: String...)  { println("Variadic parameters")}         // error: definition conflicts with previous value          func test() {             foo(2)             foo(3.14)             joinString(strings : ["I", "am", "an", "array"])             joinString(strings : "I", "am", "an", "array")         }     } } 


回答2:

You can't overload in this way:

func joinString(#strings: String[]) -> String {  ... } func joinString(#strings: String...) -> String {     ... } 

The joinString functions actually have same signature. Both take Array but the signature of the variadic version causes the compiler to generate with Array using the passed arguments at the call site.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!