如何在 init() 之前获取屏幕尺寸?

Posted

技术标签:

【中文标题】如何在 init() 之前获取屏幕尺寸?【英文标题】:How do I get the screen dimensions before init()? 【发布时间】:2014-10-07 22:13:30 【问题描述】:

我正在快速制作一个小游戏,并且想让我的玩家在屏幕上的 3 个固定点上移动。 我创建了一个数组来存储我在 init 函数中计算的值,但编译器不同意我不在 super.init() 之前声明数组。这就是我所拥有的

//properties
var player:SKSpriteNode = SKSpriteNode()
var playerPos = 1
var legalPositions: [CGFloat]


override init(size:CGSize)

    super.init(size: size)


    legalPositions[0] = self.frame.width/4
    legalPositions[0] = self.frame.width/2
    legalPositions[0] = self.frame.width/0.5


当我尝试构建它时,我得到了错误

GameScene.swift:31:9:属性“self.legalPositions”未在 super.init 调用时初始化

有没有办法在调用init函数之前初始化属性?

【问题讨论】:

【参考方案1】:

这实际上是Implicitly Unwrapped Optionals 的一个很好的用例。基本上你会将legalPositions 定义为[CGFloat]!,这将默认为nil。然后,您可以致电super.init(size: size) 之后设置它。

由于它是隐式解包的,因此您不必担心每次使用时使用可选绑定或强制解包。而且,由于您总是在 init 方法中设置它,因此您不必担心它是 nil 并导致崩溃。

//properties
var player:SKSpriteNode = SKSpriteNode()
var playerPos = 1
var legalPositions: [CGFloat]!


override init(size:CGSize)

    super.init(size: size)


    legalPositions[0] = self.frame.width/4
    legalPositions[0] = self.frame.width/2
    legalPositions[0] = self.frame.width/0.5


【讨论】:

【参考方案2】:

是的,您可以使用在初始化程序中被覆盖的虚拟值:

var legalPositions: [CGFloat] = [0]

这样,legalPositions 数组会在您调用基类初始化程序之前进行初始化。 Swift 的两阶段初始化需要这个过程,以便能够保证在创建一个类的新实例后初始化所有属性。

这种方法的好处是不需要隐式解包的选项。它们开启了设置 nil 值的可能性,这不是您想要的。

请注意,您的 sn-p 中的前两个赋值是不必要的,因为第三个赋值无论如何都会覆盖 legalPositions 数组的第一项的值。

【讨论】:

以上是关于如何在 init() 之前获取屏幕尺寸?的主要内容,如果未能解决你的问题,请参考以下文章

屏幕旋转后获取自动旋转 UIView 的尺寸?

获取可用的屏幕尺寸

微信小程序学习点滴《十二》:图片等比例缩放 获取屏幕尺寸图片尺寸 自适应

如何获取设备的屏幕尺寸? [复制]

如何在 xcode4.3 中获取和修改显示屏幕尺寸

如何一劳永逸地以编程方式获取android屏幕尺寸?