【问题标题】:Project has 144 fatal failures after running in new XCode 6项目在新的 XCode 6 中运行后出现 144 次致命故障
【发布时间】:2014-09-12 17:05:04
【问题描述】:

我使用 XCode6 beta4 通过 obj-c 和 Swift 开发我的项目。在我每安装 GM 版本之后

self.view.addSubview(startButton)

突出显示,这些行也被突出显示

scene.view.paused
self.scene.removeAllActions()
self.view.bounds

是 SpriteKit 类改变了还是我的错还是 GM 的错误?

错误是 SKView/SKScene 没有成员 ****,但我查了一下,它有那些成员。

【问题讨论】:

  • 向我们展示您收到的具体错误消息,以及触发它的完整代码行示例。
  • 我改了问题
  • @s1ddok 您能否给出self.view.addSubview(startButton) 的确切错误消息,而无需使用星号将部分消隐?
  • 添加截图,希望对您有帮助

标签: ios swift sprite-kit xcode6


【解决方案1】:

我知道我已经看到了几个有效的重复,但我目前没有找到它们,所以这里有一个快速的答案。

这与 API 中的对象参数、返回值和属性如何从 ObjC 导入到 Swift 有关。在 Xcode 6 beta 阶段的早期,所有对象参数/返回/属性都被导入为隐式展开的选项;例如

// in SKScene:
var view: UIView!
// in SKNode:
var children: [AnyObject]!

使用隐式解包可选 (IUO),您可以直接寻址 view(因此像 self.view.bounds 这样的代码是合法的)。它可能不存在,在这种情况下你会崩溃。并且某些操作在 IUO 类型上是不可能的,而在它包含的类型上是可能的。 IUO 的最佳实践是在处理它们的内容之前使用可选链接和可选绑定等结构检查它们是否为零。

ObjC-to-Swift 导入器必须对所有指向 ObjC 对象的属性/参数/返回执行此操作,因为在语法上任何指针都允许为 nil,即使在实践中它永远不会。 nil 的测试对于像 SKNode.children 这样从来不是 nil 的 API 来说有点麻烦(在无子情况下它是一个空数组)。

在过去的几个测试版和 Xcode 6 GM 中,Apple 审核了几个框架,以便将可能是 nil(如 UIViewController.view)的导入对象指针作为显式 Optionals 导入:

// SKScene
var view: UIView?

并且永远不会是 nil 的对象指针作为非可选类型导入:

// SKNode
var children: [AnyObject]

这意味着您可以安全地引用node.children,而无需担心崩溃,也无需检查nil。但是现在scene.view 是明确可选的,您必须在使用它之前检查它是否为零。

根据场景,您可以选择几种方法中的任何一种来测试或以其他方式处理可选:

  • 强制解包:self.view!.bounds.size
  • 可选链接:self.view?.bounds.size
  • 可选绑定:if let view = self.view { /* do something with */ view.bounds.size }
  • 链接和绑定:if let size = self.view?.bounds.size { /* do something with */ size }

阅读Swift 编程语言中的Optionals,详细了解每种语言的优缺点。

【讨论】:

  • 谢谢!我正在尝试通过随机放置来解决所有问题!或者 ?直到失败消失。但我稍后会深入探讨这个主题。
  • Randomly sprinkling punctuation in your code 可能会让 Xcode stip 抱怨,但不知道你的代码中有什么以及为什么以后肯定会给你带来麻烦。
  • 正如@rickster 所说,不要这样做,除非您希望代码中出现意外崩溃。不要显式(使用!)解开任何在任何情况下都可能为零的值。当您测试可选项时,您将需要处理它为 nil 的情况——这实际上是可选项背后的全部要点,正确处理故障。
【解决方案2】:

这真的不是你的错。 Swift 团队检查并清理了框架中可选项的使用。在某些情况下,隐式展开的可选项(用! 声明)变成了常规的可选项(用? 声明)。

view 现在是使用? 声明的可选选项,而不是使用! 声明的隐式解包选项。您现在需要在使用时解开该值:

self.view?.bounds.size

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-25
    • 2018-08-17
    • 2020-05-22
    • 2012-11-20
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多