Swift: не удалось найти перегрузку для преобразования, которая принимает указанный аргумент

#ios #swift

#iOS #swift

Вопрос:

Если я установлю для аргумента значение nil, появится ошибка. Код, подобный этому:

 func addChild(childToAdd: UIViewController, childToRemove: UIViewController) {
    if (childToRemove != nil) {
        childToRemove.view.removeFromSuperview()
    }

    var frame = childToAdd.view.frame as CGRect
    frame.size.width = view.frame.size.width;
    frame.size.height = view.frame.size.height;
    childToAdd.view.frame = frame
    view.addSubview(childToAdd.view)
}

override func viewDidLoad() {
    super.viewDidLoad()

    addChild(firstViewController, childToRemove: nil) //could not find an overload for conversion that accepts supplied argument
}
 

Как вы можете видеть, я не должен вводить там nil, но что я должен вставить. Он работает в Objective-c.

Ответ №1:

Ваш childToRemove параметр определен как a UIViewController , который не является необязательным , поэтому не может быть равен нулю

попробуйте :

 func addChild(childToAdd: UIViewController, childToRemove: UIViewController?) {
 

чтобы разрешить нулевое значение для вашего второго параметра, и не забывайте, что вам нужно развернуть необязательный параметр перед его использованием (использование if let — отличный способ сделать это) :

 if let childController = childToRemove {
    childController.view.removeFromSuperview()
}
 

Ответ №2:

вкратце, ваш второй параметр должен быть необязательным, если вы хотите отправить nil :

 func addChild(childToAdd: UIViewController, childToRemove: UIViewController?) {
    if childToRemove != nil {
        childToRemove!.view.removeFromSuperview()
    }

    // the rest is the same...

}