Rachit
Rachit

Reputation: 842

Unable to overload function in viewDidLoad() in swift

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"))
}

Upvotes: 2

Views: 3509

Answers (2)

Martin R
Martin R

Reputation: 539975

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")
        }
    }
}

Upvotes: 3

Bruce1q
Bruce1q

Reputation: 522

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.

Upvotes: 2

Related Questions