swift - 可以从 Swift 构造函数返回不同的实例吗?

标签 swift initializer

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/

相关文章:

arrays - 解决这个完成 block

c++ - 初始化结构指针的值

swift - 尝试用 self 初始化结构会出错。正确的做法是什么?

ruby-on-rails - 在 Ruby on Rails 中使用服务器停止守护进程

swift - SDWebImage swift 崩溃

ios - 关注者计数器未更新 firebase 中的节点

python - 在 tf.nn.conv2d 中使用权重初始化器

swift - 来自泛型类型的初始化器不会在 swift 中被继承?

ios - 将 UITextView 的文本从一个 View 更改为另一个 View

swift - 覆盖子子类中的协议(protocol)默认实现不参与动态调度