Swift Xcode 6.1 сломал мой код | Ошибка операнда

Поэтому всякий раз, когда у меня есть это:

let result = SKScrollingNode(color: UIColor.clearColor(), size:CGSizeMake(CGFloat(containerWidth), image.size.height));

Я получаю ошибку компиляции для image.size.height, сообщая мне, что "'UIImage?' не имеет члена с именем "размер", хотя он есть

Любая идея, что это значит и как это исправить?

Спасибо!

Весь фрагмент кода:

class func scrollingNode(imageNamed: String, containerWidth: CGFloat) -> SKScrollingNode {
    let image = UIImage(named: imageNamed);

    let result = SKScrollingNode(color: UIColor.clearColor(), size: CGSizeMake(CGFloat(containerWidth), image.size.height));
    result.scrollingSpeed = 1.0;

    var total:CGFloat = 0.0;
    while(total < CGFloat(containerWidth) + image.size.width!) {
        let child = SKSpriteNode(imageNamed: imageNamed);
        child.anchorPoint = CGPointZero;
        child.position = CGPointMake(total, 0);
        result.addChild(child);
        total+=child.size.width;
    }
    return result;

person Sarah    schedule 03.11.2014    source источник
comment
UIImage имеет size. UIImage? нет.   -  person matt    schedule 03.11.2014
comment
Все еще не работает: UIImage.size.height. Та же ошибка, так что проблема не в этом   -  person Sarah    schedule 03.11.2014
comment
Взгляните на этот ответ: stackoverflow.com/questions/26582035/   -  person Rodrigo Borges    schedule 03.11.2014
comment
Не могли бы вы объяснить этот бит: используйте необязательную цепочку, чтобы развернуть необязательное изображение и использовать свойство кадра UIImage. Не совсем понял.   -  person Sarah    schedule 03.11.2014
comment
Не могли бы вы показать это в моем коде? Вы можете отредактировать его, если хотите   -  person Sarah    schedule 03.11.2014


Ответы (1)


В этой строке:

let image = UIImage(named: imageNamed)

image является необязательным, UIImage?.

Ошибка в этой строке:

let result = SKScrollingNode(color: UIColor.clearColor(), size: CGSizeMake(CGFloat(containerWidth), image.size.height));

можно сузить до этого фрагмента кода:

CGSizeMake(CGFloat(containerWidth), image.size.height)

CGSizeMake требует 2 параметра CGFloat, но 2-й необязателен, потому что image необязателен:

  • если image не равно нулю, image.size.height оценивается как CGFloat
  • если image равно нулю, image.size.height равно нулю

Чтобы этого избежать, у вас есть 2 варианта:

  1. сделать image необязательным, используя принудительную распаковку

    let image = UIImage(named: imageNamed)!
    

    но я не рекомендую его использовать, потому что, если создание UIImage завершится ошибкой, приложение рухнет.

  2. Используйте необязательную привязку:

    let image = UIImage(named: imageNamed);
    if let image = image {    
        let result = SKScrollingNode(color: UIColor.clearColor(), size: CGSizeMake(CGFloat(containerWidth), image.size.height));
        // ... rest of the code here
    }
    

    это лучший способ развернуть необязательный параметр, потому что в случае, если он равен нулю, код в операторе if будет пропущен, и не возникнет ошибки времени выполнения.

person Antonio    schedule 03.11.2014