node.physicalBody.joints 向下转型错误

2023-12-03

以下代码给出了一个错误 - 物理关节数组似乎具有 PKPhysicsJoint 类。有人知道如何在 Swift 中迭代关节吗?

The 文档确实说物理Body.joints应该返回一个SKPhysicsJoint数组。

import SpriteKit

let scene = SKScene(size: CGSize(width: 200, height: 200))
let nodeA = SKNode()
let nodeB = SKNode()

nodeA.physicsBody = SKPhysicsBody(circleOfRadius: 20)
nodeB.physicsBody = SKPhysicsBody(circleOfRadius: 20)

scene.addChild(nodeA)
scene.addChild(nodeB)

let joint = SKPhysicsJointFixed.jointWithBodyA(nodeA.physicsBody, bodyB: nodeB.physicsBody, anchor: CGPointZero)
scene.physicsWorld.addJoint(joint)

for joint in nodeA.physicsBody!.joints as [SKPhysicsJoint] {
  // do something else here
}

给出错误:

Execution was interrupted. reason: EXC_BAD_INSTRUCTION...

Update: This was一个错误,它已在 iOS 9 / OS X 10.11 中修复 - 问题中的代码现在可以正常工作。

为后人/使用旧版 SDK 等的人留下原始答案文本。


这看起来像一个错误 -你应该把它归档。很难说它应该被视为 SpriteKit bug 还是 Swift bug,但那是 Apple 的问题,而不是你的问题。 :)

如果您将代码粘贴到游乐场中,问题就很明显了——您的joint实际上是一个PKPhysicsJointWeld在幕后。这是一些应该是实现细节的内部类。在 ObjC 中这没有问题,因为在 C 中进行转换只是告诉编译器“相信我,这个指针实际上是一个SKPhysicsJoint,所以让我在其上调用物理联合方法(而不是其他方法),并且没有人会更明智”。Swift 中的转换要求在转换的类型之间存在类型层次结构关系 - 并且PKPhysicsJointWeld不是以下的子类型/子类SKPhysicsJoint,所以转换失败。

您可以通过避免强制转换来解决此问题[SKPhysicsJoint]:

for joint in nodeA.physicsBody!.joints {
    // do something else here
}

这样,你就失去了一些类型安全性——joint is an AnyObject,就像 ObjC 的idtype 编译器允许您调用其上的任何方法。 (如果该对象没有实现该方法,它可能会在运行时失败。)但至少它可以运行。

进一步的解决方法:在循环内,您可以强制转换joint to SKPhysicsJoint。但由于该转换是跨类型层次结构的,因此您必须使用unsafeBitCast:

for joint in nodeA.physicsBody!.joints {
    let skJoint = unsafeBitCast(joint, SKPhysicsJoint.self)
    // do stuff with skJoint
}

这会让你恢复一点编译时类型的“安全”,因为此后编译器将需要你做的任何事情skJoint兼容SKPhysicsJoint,但它本质上仍然是不安全的,因为它依赖于一些可能并不总是有效的运行时类型。你必须unsafeBitCast再次到达特定的联合子类,而不知道它可能是哪个子类。 (再次,这是提交错误的好时机.)


(您可能会注意到,粘贴到游乐场时physicsWorld也是一个内部类:PKPhysicsWorld。那么为什么这也不会失败呢?当您使用physicsWorld属性,所有类型转换都发生在 ObjC 端,并且 Swift 信任 ObjC 告诉它的任何内容。当你处理joints但是,您必须在 Swift 端进行类型转换,并且 Swift 对于类型检查更加严格。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

node.physicalBody.joints 向下转型错误 的相关文章

  • DispatchWorkItem 未通知主线程

    注意 这不是我已经见过的重复问题调度组 无法通知主线程 https stackoverflow com questions 38552180 dispatch group cannot notify to main thread 没有任何关
  • 在 swift 中使用 RegExp 降低浮点精度

    我正在尝试降低嵌入字符串中的浮点数的精度 The example is 93829 38 1415 45467897 我想剪切浮点数以获得最大精度为2的浮点数 我可以直接剪切字符串 不需要以某种方式对数字进行舍入 The example i
  • ObjectAL自动中断处理错误

    我一直在 SpriteKit 游戏运行时打电话 以测试中断 我正在使用 ObjectAL 文档中的示例 名为 使用 OpenAL 对象和 OALAudioTrack http kstenerud github io ObjectAL for
  • 为什么包装 os_log() 会导致双精度数无法正确记录?

    考虑以下示例 import Foundation import os log class OSLogWrapper func logDefault message StaticString args CVarArg os log messa
  • 快速更改 uiviewcontroller 的视图

    我创建一个新的UIViewController 我不使用故事板 这是我的代码 我想更改我的视图框架 这对我不起作用 我尝试添加viewWillAppear 还是不行 我知道我可以添加一个新的UIView去做吧 我可以更改视图控制器的视图吗
  • 在 Swift 中从另一个 ViewController 访问变量

    我有以下内容ViewController class PageContentViewController UIViewController var pageIndex Int 我如何访问pageIndex来自另一个 ViewControll
  • 在 Swift 中,当使用“[weak self] in”时,当嵌套在另一个闭包中时我是否应该加倍它[重复]

    这个问题在这里已经有答案了 在 Swift 中 当使用 weak self in 当嵌套在另一个闭包中时 我应该将其加倍吗 Example override func viewDidLoad super viewDidLoad makeAP
  • iOS上数组的Swift Metal并行求和计算

    基于 Kametrixomanswer https stackoverflow com questions 38164634 compute sum of array values in parallel with metal swift
  • Swift - 带有两行文本的 UIButton

    我想知道是否可以创建一个包含两行文本的 UIButton 我需要每一行都有不同的字体大小 第一行为 17 点 第二行为 11 点 我尝试过将两个标签放在 UIButton 内 但我无法让它们留在按钮的范围内 我试图在 ui 构建器中完成所有
  • Swift NSAttributedString 修剪

    我想摆脱 NSAttributedString 前面和末尾的空白 修剪它 我不能简单地将其转换为字符串并进行修剪 因为其中有图像 附件 我该怎么做 创建扩展NSAttributedString如下 extension NSAttribute
  • Swift iOS - 视觉框架文本识别和矩形

    我试图在使用 Vision 框架找到的文本区域上绘制矩形 但它们总是有点偏离 我这样做是这样的 public func drawOccurrencesOnImage occurrences CGRect image UIImage gt U
  • 链接器命令失败,退出代码为 1 -- Firebase

    对 iOS 开发相当陌生 有些人在将 firebase 安装到我的 iOS 应用程序中时遇到了一些麻烦 本质上 该应用程序要做的就是从 Firebase 数据库中获取有关全国各地路线的信息 该信息将输出到表格视图 该表格视图将允许用户选择其
  • 将领域列表转换为领域结果

    只是想知道如何将列表转换为结果 因为我正在对区域和区域进行过滤 当用户选择区域时 区域应该仅显示该区域中的那些区域 当我将我的区域分配给定义为的变量时var areas Results area 我得到了编译错误 无法将 列表 类型的值分配
  • 如何快速比较CGPoints?

    我有2个CGPoint like let a CGPoint CGPointMake 1 1 let b CGPoint CGPointMake 1 1 如果两者相同那么我想做点什么 这只是一个例子 但我想比较这两个 CGPoint 我发现
  • 在XCode中快速查看Swift变量的类型

    有没有什么快捷方式可以让我在 XCode 中快速查看 Swift 中任何变量的类型 Alt 单击返回 无快速帮助 类型推断非常棒 但是如果没有这些工具 生活就会变得困难 Either use Alt click to display the
  • 如何在 Swift MacOS 应用程序中实现 AppleScript 支持

    我正在做一个SwiftMacOS 应用程序通过串行端口与外部设备交互 我可以通过应用程序控制设备 但我希望能够使用 AppleScript 在其他应用程序中控制它 我需要的只是one简单的方法就像tell application App t
  • UIPopoverBackgroundView contentViewInsets 必须由子类实现

    我正在实现一个自定义 PopoverBackgroundView 并按照指定斯威夫特文档 https developer apple com library ios documentation UIKit Reference UIPopov
  • iOS、Swift 3 - 当我从详细视图返回后单击“取消”时,UISearchBar 消失

    我在containerView中有一个tableView 以编程方式向其添加一个搜索栏 一切工作正常 除了这种情况 当我点击一个单元格时 当 tableView 由 searchBar 过滤时 然后我从明细视图返回 通过推送转场呈现 然后我
  • SwiftUI 多行文本背景颜色

    我在 SwiftUI 中有一个包含多行的文本视图 我知道我可以更改文本的背景颜色 Text
  • 更改 RealityKit 中 AnchorEntity 的旋转

    我在放置对象 3 秒后将 3d 对象放置到 ARViewController 中 然后我想将对象旋转 90 度 arView scene addAnchor anchorEntity DispatchQueue main asyncAfte

随机推荐