Swift 2 迁移错误:在 SKSpriteNode 的指定初始化器中不能再传入 nil

Posted

技术标签:

【中文标题】Swift 2 迁移错误:在 SKSpriteNode 的指定初始化器中不能再传入 nil【英文标题】:Swift 2 migration error: no longer can pass in nil in the designated initialiser of SKSpriteNode 【发布时间】:2015-07-06 15:48:04 【问题描述】:

尝试将我的项目迁移到 Swift 2。

我收到大量编译器错误,其中大部分很容易修复,因为它们只是语法更改。

但是,我不知道处理此错误的最佳方法:

SKSpriteNode 的子类调用指定的初始化程序时,我收到错误消息:“Type 'UIColor' does not conform to protocol 'NilLiteralConvertible'” for passing nil for the color:

import SpriteKit

class MyClass: SKSpriteNode 

  init() 
    let texture = SKTexture(imageNamed: "MyTexture.png")
    super.init(texture: texture, color: nil, size: texture.size())
  

我可以通过传入UIColor.clearColor() 来解决这个问题,但我觉得这不是处理这个问题的正确方法。

非常感谢任何建议,以及这里发生了什么变化(当然,一个解释链接就足够了)?

【问题讨论】:

【参考方案1】:

在 Swift 1.2 中,您调用 super 的初始化程序用于接受颜色的隐式解包选项,因此您可以传递 nil

在 Swift 2 中,相同的初始化程序不再接受可选项,如果使用它,则必须传递 UIColor(参见 docs)

您传递UIColor.clearColor() 的解决方案对我来说似乎是合理的!

【讨论】:

【参考方案2】:

看起来,according to the docs(虽然没有明确说明,这令人困惑),如果您使用颜色进行初始化,则需要传递除nil 之外的实际值。

我的结论是你可以只使用纹理和大小进行初始化:

convenience init(texture: SKTexture?, size: CGSize)

使用它不会默认颜色,它应该会给你你正在寻找的结果,而不需要 UIColor 声明 UIColor.clearColor()。但是,如果您只是使用纹理进行初始化,则颜色将默认为白色(1.0,1.0,1.0),并且大小将继承自纹理:

convenience init(texture texture: SKTexture?)
//The size property of the sprite is set to the dimensions of the texture. The color property is set to white (1.0,1.0,1.0).

鉴于此,我会假设(再次,您是对的,这确实令人困惑)您需要传递一些值,无论是 RGB 还是 UIColor

【讨论】:

有趣的是,有一些方便的初始化器不需要你传递颜色,但是你必须在super上调用一个指定的初始化器 哦,我明白了,用于创建您自己的 SKSpriteNode 子类的便捷初始化程序也是如此吗?我想我对何时使用它们感到困惑。 出于方便 :) 如果您对为您设置的一些默认值感到满意,或者如果您特别需要初始化程序提供的一些额外行为......在所有情况下,当您调用便利初始化程序时它最终会在该类上调用一个指定的初始化器,然后它必须在其超类上调用一个指定的初始化器 - 请参阅此处的“类继承和初始化”->developer.apple.com/library/prerelease/ios/documentation/Swift/…(以及“操作中的指定和便利初始化器”)跨度> 我意识到我的第一条评论可以更明确地说:“当你为子类编写指定的初始化程序时,它的实现必须在它的超类上调用指定的初始化程序”,以及“当你编写一个子类的便利初始化程序,它必须为您的子类调用另一个便利初始化程序或指定的初始化程序 - 如果您最终调用了一系列便利初始化程序,则该链最终必须以其中一个为您的类调用指定的初始化程序结束(当然,它会在其超类上调用指定的初始化程序......)"

以上是关于Swift 2 迁移错误:在 SKSpriteNode 的指定初始化器中不能再传入 nil的主要内容,如果未能解决你的问题,请参考以下文章

从 swift 1.2 迁移后 swift2 中的 healthKit 错误

Swift 2 迁移错误:在 SKSpriteNode 的指定初始化器中不能再传入 nil

Swift 2.3 到 Swift 3.1 迁移 - Alamofire 请求错误

从Swift 3.2迁移到Swift 4我使用autosavesInPlace收到错误

Swift 2 到 3 迁移错误(libc++abi.dylib:以 NSException 类型的未捕获异常终止)

touchesBegan Swift 2 自定义 SpriteKit 节点