Alexander Tsepkov
Alexander Tsepkov

Reputation: 4186

Ambiguous use of "init" with optional arguments in Swift 2

I've just updated my code from Swift 1.2 to Swift 2.1. The project was fully-functioning with previous version of Swift, but now I'm seeing "Ambiguous use of 'init'" errors. Each occurrence of this error seems to be caused by the use of optional arguments in the constructor. I've even managed to reproduce this issue in Xcode Playground with the following simplified code using the same pattern:

class Item : UIView {
    override init(frame: CGRect = CGRectZero) {
        super.init(frame: frame)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}

let i = Item()             # Ambiguous use of 'init(frame:)'

However, I still don't understand why Swift 2.1 now has a problem with this pattern, or what the alternative should be. I've tried searching for this, but all I've stumbled upon was "ambiguous use" errors for other (non-constructor) methods due to method renaming or signature changing, neither of which is the case here.

Upvotes: 3

Views: 7033

Answers (1)

Witterquick
Witterquick

Reputation: 6140

It's ambiguous use because when u call let i = Item(), there are 2 options - the init(frame: CGRect = CGRectZero) and the init()

it's better to do something like this:

override init(frame: CGRect) {
    super.init(frame: frame)
}

convenience init() {
    self.init(frame: CGRectZero)
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}

Upvotes: 4

Related Questions