菜鸟教程小白 发表于 2022-12-11 16:45:57

ios - == 究竟如何与 Set() 一起工作 - Swift


                                            <p><p>我正在运行这段代码</p>

<pre><code>if(left.comboOptions.count != right.comboOptions.count) {
    for index in 0...left.comboOptions.count-1{
      print(left.comboOptions.selectedComboOptionDishes == right.comboOptions.selectedComboOptionDishes)
      print(left.comboOptions.selectedComboOptionDishes)
      print(&#34;vs&#34;)
      print(right.comboOptions.selectedComboOptionDishes)
      print()
    }
}
</code></pre>

<p>我得到的输出是</p>

<pre><code>Comparing comboOptionDish
1x Black Beans Wrap(277) vs 1x Black Beans Wrap(277)
Both are equal

true

vs


false

vs


true
[]
vs
[]
</code></pre>

<blockquote>
<p><strong>Why is == on Set() returning <code>false</code> on index 1 (second one here)?? and Why is <code>==</code> block not executed for <code>Fresh Lemon Juice</code>???</strong>
What am I doing wrong? Or the way == operates on Set() differs specifically?</p>
</blockquote>

<p>我的 ComboOptionDish 类是</p>

<pre><code>class ComboOptionDish: Equatable, Hashable, CustomStringConvertible {

    var id: Int!
    var quantity: Int = 0
    var dish: Dish! /*Contains name, id and price and nothing else*/
    var description: String {
      return String(quantity) + &#34;x &#34; + dish.name + &#34;(&#34; + String(id) + &#34;)&#34;
    }

    var hashValue: Int {
      return self.id * self.quantity
    }
}

func == (left: ComboOptionDish, right: ComboOptionDish) -&gt; Bool {
    print(&#34;Comparing comboOptionDish&#34;)
    print(String(left) + &#34; vs &#34; + String(right))
    if left.id != right.id { print(&#34;IDs not equal\n&#34;); return false }
    if left.quantity != right.quantity { print(&#34;Quantity not equal\n&#34;); return false }
    print(&#34;Both are equal&#34;)
    print()
    return true
}
</code></pre>

<p>我的 ComboOption 类是</p>

<pre><code>class ComboOption: Mappable, Equatable {

    var id: Int!
    var name: String!
    var selectedComboOptionDishes: Set&lt;ComboOptionDish&gt; = Set()
    var comboOptionDishes: ComboOptionDish = []

}
</code></pre>

<p>编辑:我如何填充数据?</p>

<ul>
<li>我使用 ObjectMapper 使用 JSON 填充数据。 </li>
<li>我有许多 <code>ComboOption</code>,每个都包含许多 <code>ComboOptionDish</code>es。</li>
<li>然后我让用户选择 <code>ComboOptionDish</code>es,我将其添加到 <code>selectedComboOptionDishes</code> 这是 <code>ComboOptionDish</code> 的 <code>Set()</code> code>es 里面对应的<code>ComboOption</code></li>
<li>然后我现在需要比较两个 <code>ComboOption</code> 是否相等,所以我需要为 <code>ComboOption</code></li 覆盖 <code>==</code> >
</ul></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我无法重现您的问题,但我相信这是平等过载的错误。有一个类似的话题<a href="https://stackoverflow.com/questions/31099379/bug-with-equals-operator-and-nsobjects-in-swift-2-0" rel="noreferrer noopener nofollow">here</a> .</p>

<p>解决方法是让 <code>ComboOptionDish</code> 子类 <code>NSObject</code> 并使用 <code>isEqual</code> 。</p>

<pre><code>class ComboOptionDish: NSObject {
    override var description: String {
      //...
    }

    override var hash: Int {
      //...
    }

    override func isEqual(object: AnyObject?) -&gt; Bool {
      if let other = object as? ComboOptionDish {
            return self.id == other.id &amp;&amp; self.quantity == other.quantity
      } else {
            return false
      }
    }
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - == 究竟如何与 Set() 一起工作 - Swift,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/37908994/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/37908994/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - == 究竟如何与 Set() 一起工作 - Swift