0

所以每当我有这个:

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

我收到 image.size.height 的编译错误,告诉我“'UIImage?' 没有名为“size”的成员,尽管它有

知道这意味着什么以及如何解决吗?

谢谢!

整个代码片段:

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;
4

1 回答 1

4

在这一行:

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参数,但第二个是可选的,因为image它是可选的:

  • 如果image不为零,则image.size.height计算为 CGFloat
  • 如果image为 nil,则image.size.height计算结果为 nil

为了避免这种情况,您有两种选择:

  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
    }
    

    这是解开可选项的更好方法,因为如果它为 nil,if语句中的代码将被跳过并且不会发生运行时错误。

于 2014-11-03T16:06:07.903 回答