2016-01-19 3 views
3

Я только что обновил свой код от Swift 1.2 до Swift 2.1. Проект полностью функционировал с предыдущей версией Swift, но теперь я вижу «Неоднозначное использование ошибок« init ». Кажется, что каждое возникновение этой ошибки вызвано использованием необязательных аргументов в конструкторе. Я даже удалось воспроизвести этот вопрос в Xcode Playground со следующим упрощенным кодом по той же схеме:Неоднозначное использование «init» с необязательными аргументами в Swift 2

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:)' 

Однако, я до сих пор не понимаю, почему Swift 2.1 теперь имеет проблемы с этим рисунком, или что альтернатива должна быть. Я попытался найти это, но все, на что я наткнулся, было ошибкой «неоднозначного использования» для других (неконструкторных) методов из-за переименования метода или изменения подписи, ни один из которых здесь не имеет места.

+1

Этот сниппет не работает в Swift 1.2 либо (я только что протестировал). Возможно, ваш реальный код сделал, но эта часть этого не делает. – Moritz

+0

странно, глядя на diff, пытаясь понять, что еще может измениться, но не увидев ничего другого, связанного с этим, и у меня не было проблем с созданием этого кода раньше (сравнение с pre-swift2 commit). –

+0

Итак, после более тщательного изучения (не удалось проверить старую версию Swift до тех пор, пока я не установил более старую виртуальную машину), ошибка Swift 1.2 дает другое. В этом конкретном случае Swift 1.2 пытается вызвать конструктор с помощью кодера. Я не уверен, почему это не происходит в самом моем приложении, так как там есть конструктор aDecoder, и все аргументы init являются необязательными, поэтому он не имеет больше информации. –

ответ

4

Это неоднозначное использование, потому что, когда и называть Пусть I = Пункт(), есть 2 варианта - Инициализационные (рама: CGRect = CGRectZero) и Init()

это лучше сделать что-то вроде этого:

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

Спасибо, я изменил его, как вы предложили, и теперь он работает. –

Смежные вопросы