菜鸟教程小白 发表于 2022-12-11 18:03:33

ios - 如何在 Swift 3 的基类中实例化一个对象


                                            <p><p>我有一个 ModelBase 类,我从它继承了几个类(即 Task、Milestone 等)。我想创建一个名为“all”的静态方法,它将获取所有模型(假设是一个数组),但我希望数组的类型为 而不是 。尽管如果可能的话,我不想为每个子类编写该方法。 </p>

<pre><code>class Task: ModelBase {
    override class var tableName : String {return &#34;Task&#34;}
</code></pre>

<p>}</p>

<p>那我可以做:</p>

<pre><code>Task.all({ (tasks:) in
   // do stuff with tasks
});
</code></pre>

<p>到目前为止,我一直在使用 type(of: self) 来访问非静态/类方法中的类级别变量。 </p>

<p>但是,我想要一个可以从 API 获取模型的静态方法,但我不知道如何引用当前类(即本例中的 Task)</p>

<p>如果我尝试做的事情有意义/可行,请告诉我。这是我从解析中获取的示例代码。 </p>

<pre><code>class ModelBase: NSObject {

// THIS WORKS FINE ---&gt;
class var tableName : String {return &#34;ModelBase&#34;}

init(_ _dictionary: ) {

      self.dictionary = _dictionary
      _parseObject =PFObject(className: type(of: self).tableName)
}

// THIS IS WHAT FAILS --------------&gt;
class func all(_ success: @escaping () -&gt;(), failure: @escaping (Error) -&gt; ()){
    var models= ()
    let questsQuery = PFQuery(className: ModelBase.tableName)

    questsQuery.findObjectsInBackground {
      (objects: ?, error: Error?) -&gt; Void in

      if let error = error {
            failure(error)
      } else {
            if let objects = objects {
                for object in objects {
                  models.append(ModelBase(parseObject: object as PFObject))
                }
                success(models)
            } else {
                success([])
            }
      }
    }
}

}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>如果我理解正确,您希望此代码在 ModelBase 的任何子类上多态。为此,我建议使用泛型。</p>

<pre><code>class func all&lt;T: ModelBase&gt;(_ success: @escaping () -&gt;(), failure: @escaping (Error) -&gt; ()) {
    let questsQuery = PFQuery(className: T.tableName)

    questsQuery.findObjectsInBackground {
      (objects: ?, error: Error?) -&gt; Void in

      if let error = error {
            failure(error)
            return
      }

      guard let objects = objects else {
            success([])
            return
      }

      let models = objects.map(T.init(parseObject:))
      success(models)
    }
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 如何在 Swift 3 的基类中实例化一个对象,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/40598506/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/40598506/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 如何在 Swift 3 的基类中实例化一个对象