Objective-C 具有一种奇特但非常有用的能力,可以使初始化程序返回与正在调用的初始化程序不同的实例。您可以阅读 here .
这对于类集群之类的事情非常有用,但即使对于确保根据特定条件返回特定实例这样简单的事情(即,使用帐号新建一个 Account 类将始终返回该 Account 类的相同实例)数。)
但是,在我们的应用程序中,我们使用的是 Swift,但我在这种语言中没有看到任何此类规定。有这样的事吗?
通常我们只需创建一个类方法来返回我们感兴趣的实例,但是虽然我们拥有相关的类,但我们不拥有使用标准初始化语法的调用代码。例如
let foo = OurClass()
我们希望根据一些外部条件来控制将哪个实例交还给他们(为了清楚起见,此处省略。)
那么 Swift 有这样的机制吗?
最佳答案
虽然不像 Objective-C 那样简单或干净,但希望您应该能够使用方便初始化器或失败初始化器(或两者)来实现您的目标。
便利初始化程序允许您将初始化委托(delegate)给另一个初始化程序,本质上使您可以控制对象的初始化方式:
class RecipeIngredient {
var quantity: Int
init(quantity: Int) {
self.quantity = quantity
}
convenience init() {
// You control how the properties are initialized here
if (/* Some external or internal condition */) {
self.init(quantity: 1)
}
else {
self.init(quantity: 2)
}
}
}
// The caller
let mysteryFood = Food()
如果条件不满足或者在初始化过程中发生错误,可失败初始化程序允许您在指定的初始化程序中返回 nil:
class Account {
var id: Int
// Failable initializers have '?' after init
init?(id: Int) {
// You control if the initialization succeeds or not
if (/* check your db if id is duplicate, for example */) {
return nil
}
// Succeeds
self.quantity = quantity
}
}
// The caller
let account = Account(id: 5)
if (account == nil) {
// It failed
}
else {
// It succeeded
}
就您的情况而言,根据您的评论,听起来您可能希望使用一个失败的初始值设定项,如果调用者尝试创建重复实例,该初始值设定项将返回 nil。
希望这符合您正在寻找的内容!
关于swift - 可以从 Swift 构造函数返回不同的实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40853627/