Подтвердить что ты не робот

Вниз из "UIImage"? на "UIImage" только разворачивает варианты

Я создаю UIButton с изображением,

Я написал для этого код ниже:

    let btnImg=UIButton.buttonWithType(UIButtonType.Custom) as UIButton
    let img  = UIImage(named: "turn_left") as UIImage
    btnImg.setTitle("Turn left", forState: UIControlState.Normal)
    btnImg.setImage(img, forState: UIControlState.Normal)
    btnImg.frame = CGRectMake(10, 150, 200, 45)
    self.view.addSubview(btnImg)

Но я получил ошибку ниже let img = UIImage(named: "turn_left") as UIImage:

Swift Compiler error:
 Downcast from 'UIImage?' to 'UIImage' only unwraps optionals; did you mean to use '!'?
4b9b3361

Ответ 1

Как ошибка Говорит, что вы должны использовать '!',

Попробуйте код ниже,

   let img  = UIImage(named: "turn_left") as UIImage!  // implicitly unwrapped

ИЛИ

   let img : UIImage? = UIImage(named: "turn_left")  //optional

Edit

После создания img вам нужно проверить его на nil перед его использованием.

Ответ 2

Вы всегда можете сделать это в "if let", но обратите внимание на разницу в синтаксисе в зависимости от версии swift.

Swift < 2.0:

if let img = img as? UIImage {

Swift 2.0:

if let img = img as UIImage! {

Обратите внимание на положение восклицания

Ответ 3

Если инициализатор UIImage не может найти указанный файл (или какая-либо другая ошибка), он вернет nil, согласно документации Apple

Return Value
The image object for the specified file, or nil if the method could not find the specified image.

Итак, вам нужно поставить проверки:

let img  = UIImage(named: "turn_left")
if(img != nil) {
    // Do some stuff with it
}

Вам не нужно бросать UIImage в UIImage, что отходы.

Изменить: Полный код

let img  = UIImage(named: "turn_left")
if(img != nil) {
    let btnImg = UIButton.buttonWithType(UIButtonType.Custom) as UIButton
    btnImg.setTitle("Turn left", forState: UIControlState.Normal)
    btnImg.setImage(img, forState: UIControlState.Normal)
    btnImg.frame = CGRectMake(10, 150, 200, 45)
    self.view.addSubview(btnImg)
}

Возможно, вы захотите установить else, чтобы установить кнопку в фигуру или что-то еще, что более вероятно работает в случае, если "turn_left" не существует.

Ответ 4

Так как UIImage(named:"something") возвращает необязательный (потому что он может быть равен нулю, если методы не найдут подходящее изображение, лучше всего это не явно развернуть результат (иначе ваше приложение выйдет из строя), но чтобы немедленно проверить результат с чем-то вроде этого:

        if let image = UIImage(named: "something"){
        // now you can use image without ? because you are sure to have an image here!
        image.description
        }

    // continue your code here using the optional power of swift vars! :)

Подход заключается в следующем: если изображение необязательно, оно может быть нулевым. Функции, которые принимают входные данные, могут обрабатывать это, в противном случае они обычно имеют неожиданное поведение. UIImage(named:) может возвращать нуль, и вы должны справиться с этим. Если вы явно развернете его, у вас могут возникнуть проблемы позже.

С if let something = ... что-то будет автоматически развернуто во время выполнения, и вы можете безопасно использовать его.