目标

我希望使用SKSpriteNodeposition属性设置游戏场景中一个子 node 的位置,并将一个内联数学表达式作为参数传递给y参数.我要添加的子 node 是SKSpriteNode的子类,它有一个名为yOffset的定制Int属性.理想情况下,我希望使用yOffset来移动 node 的位置.

我所try 的

最初,我将偏移量作为参数的一部分硬编码为CGPoint,即myNode.position = CGPoint(x: myNode.position.x, y: myNode.position.y - 100),并按照预期将 node 定位在场景中.

然而,一旦我改为使用yOffset,即myNode.position = CGPoint(x: myNode.position.x, y: myNode.position.y - myNode.yOffset),我就得到了一个编译器错误,提示‘无法将’Int‘类型的值转换为预期的参数类型’CGFloat‘’.为了解决这个问题,我将myNode.yOffset更改为CGFloat(myNode.yOffset),编译正常.然而,现在在场景中找不到该 node . node 计数仍然显示该 node 已添加,但我不知道它在哪里.

为了避免演员阵容变为CGFloat,我还try 将yOffset改为Double,而不是Int.代码编译得很好,但同样的问题出现了, node 也找不到了.

我想知道的是

首先,为什么当在计算中使用诸如100之类的数字文字时,代码编译并且 node 显示得很好,而当使用实例属性yOffset(也是Int)时,它需要强制转换为CGFloat?既然它是一个Int,就像任何数字文字一样,它不应该编译吗?

其次,与在参数中使用数字文字相比,当yOffset强制转换为CGFloat时,为什么 node 的位置不会像预期的那样行为?

这与点到像素的转换有关吗?

推荐答案

根据系统体系 struct 的不同,CGFloat在幕后是DoubleFloat,而标准库浮点类型,如FloatDouble,符合ExpressibleByIntegerLiteral协议.这意味着您可以通过分配一个整型文字来初始化这些类型中的任何一个变量或常量,并且它将被与协议相关联的初始化器"转换"为CGFloat.当您提供内联的整型文字为y: myNode.position.y - 100时,就会发生这种情况.

当您将Offset属性指定为Int时,就不能在需要CGFloat的计算中使用它--因为它不再是文字值,所以ExpressibleByIntegerLiteral初始化器不能用来将其转换为CGFloat.因此,你就是最初的错误.

如果没有看到完整的代码,而不是内联代码段,就不清楚为什么在使用yOffset属性进行偏移时会出现位置错误.没有明显的原因.您是否已经使用调试器查看了代码,以判断实际发生的情况,确认实际属性值是您认为的值,以及Sprite的位置值是什么?

Swift相关问答推荐

AirPods手势不发送AVAudioApp静音状态通知

UITableView未显示类数组数据

ARRaycast Query和前置摄像头(ARFaceTrackingConfiguration)

SWIFT异步/等待,多个监听程序

如何观察UIViewRepresentable中的多个变化?

将变量设置为 @Published 会 destruct 代码而不会出现任何错误

Swift数据关系

SwiftUI 中的同一个 ForEach 中是否可以有 2 个数组?

关于变量的视图的 SwiftUI 生命周期

闭包 - deinit self 对象的时间

在 Vapor 4 中使用协议的通用流利查询

Swift-如何接受多个(联合)类型作为参数

(SwiftLint)如果有正文,如何编写规则(可能是自定义),在{之后总是\n(换行)?

如何在 SwiftUI 中打开 ImagePicker?

Swift - 导入我的 swift 类

如何从 UITableViewCell 类中引用 UITableViewController?

将 UIImage 剪成圆形

键盘显示时Tableview滚动内容

从 Swift 初始化程序调用方法

Xcode6 中的 Swift 类与 Cocoa Touch 类