gpt4 book ai didi

swift - 如何从 swift 3 中的 init 中提前返回

转载 作者:可可西里 更新时间:2023-11-01 00:57:24 25 4
gpt4 key购买 nike

我有一个应用程序,我想在其中根据是否已经有一个等效的对象保存到用户默认值来创建一个对象。如果检测到对象,我想在类 init 中检测到它并提前返回。这就是我想要做的:

init() {

/* There are two possibilities when creating a hero:
1. The hero is brand new and needs to be built from scratch
2. The hero is loaded from defaults */

// Check to see if there is existing game data:

if defaultExistsForGameData() {
// This means there is a hero to load and no need to create a new one
self = extractHeroFromDefaults() // This just loads from UserDefaults
print("Loading hero from defaults with name of: \(hero.heroName).")

return self
}

// These actions are for creating a brand new hero
let size = CGSize(width: 32, height: 32)
let heroTexture = SKTexture(imageNamed: "hero2.ico")
super.init(texture: heroTexture, color: .clear, size: size)

self.isUserInteractionEnabled = true
self.name = "hero"

self.zPosition = 50

}

控制台中有几个错误,self 是不可变的,等等。我想知道这是否是一个有效的模式,或者我是否应该采取完全不同的方法。

最佳答案

在 Swift 中(与 ObjC 不同),init 不能返回与自身不同的对象。实现您在这里尝试做的事情的一种常见方法是使用类工厂方法(如果您不希望其他对象能够直接调用它,可以选择将 init 设为私有(private))。

例如,沿着这些线的东西:

class func loadOrCreate() -> Hero {
if defaultExistsForGameData() {
// This means there is a hero to load and no need to create a new one
print("Loading hero from defaults with name of: \(hero.heroName).")
return extractHeroFromDefaults() // This just loads from UserDefaults
} else {
return Hero()
}
}

private init() {
let size = CGSize(width: 32, height: 32)
let heroTexture = SKTexture(imageNamed: "hero2.ico")
super.init(texture: heroTexture, color: .clear, size: size)

self.isUserInteractionEnabled = true
self.name = "hero"

self.zPosition = 50
}

另一种更接近您当前 API 的方法是创建一个单独的(可能是私有(private)的)指定初始化程序,如下所示:

private init(name: String, zPosition: Int) {
let size = CGSize(width: 32, height: 32)
let heroTexture = SKTexture(imageNamed: "hero2.ico")
super.init(texture: heroTexture, color: .clear, size: size)

self.isUserInteractionEnabled = true
self.name = name
self.zPosition = zPosition
}

public convenience init() {
let name: String
let zPosition: Int
if defaultExistsForGameData() {
name = defaultName() // Read it out of user defaults
zPosition = defaultZPosition
} else {
name = "hero"
zPosition = 50
}
self.init(name: name, zPosition: zPosition)
}

这种方法的一个问题是它可能有点出人意料。如果您创建多个 Hero 对象,目前还不清楚会发生什么。 loadOrCreate() 之类的东西非常清楚地表明存在外部影响。

关于swift - 如何从 swift 3 中的 init 中提前返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42839698/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com