簡體   English   中英

Swift中的運算符優先級

[英]Operator Priority in Swift

我花了幾個小時來嘗試調試一些代碼,通過消除過程,我得以解決問題,但我無法弄清楚原因及其困擾。

因此,需要一些上下文:我們希望基於Object -> Bool類型的謂詞集合來過濾對象數組(我們將其簡稱為Object類型)。 我們首先將所有謂詞組合到一個組合函數中,然后將filter函數與我們的組合謂詞一起使用以獲取過濾后的對象數組。 所以這是一個例子:

var predicateA: (Object -> Bool) = { (obj) in obj.isFoo }
var predicateB: (Object -> Bool) = { (obj) in obj.isBar }
var composedPredicate: (Object -> Bool) {
  return { (obj) in
    return predicateA(obj) && predicateB(obj)
  }
}

上面的示例運行完美,但是當嘗試為謂詞引入可選內容時,它無法按預期運行。

var predicateA: (Object -> Bool) = { (obj) in obj.isFoo }
var optionalPredicateB: (Object -> Bool)? = nil
var composedPredicate: (Object -> Bool) {
  return { (obj) in
    return predicateA(obj) 
      && optionalPredicateB != nil ? optionalPredicateB!(obj) : true
  }
}

因此,即使“ sub-predicates”之一返回false,以上代碼也將使compositedPredicate始終返回true。

可以通過將optionPredicateLine更改為包括parans來解決此問題

&& (optionalPredicateB != nil ? optionalPredicateB!(obj) : true)

編輯:

我認為錯誤是由於三元運算符的優先級所致,即它正在評估所有&&語句之前的&&語句? 在確定要使用哪種情況時,在三元運算符中。

盡管我對此不是100%的確定,所以我正在尋求澄清/或者原因是否有其他原因。

您可以在此處找到運算符的優先級。 它顯示“ &&”的優先級為120,而“?:”的優先級為100,而“!=”的優先級為130。因此,在三元運算符之前對“ &&”進行求值,等效於:

return (predicateA(obj) && (optionalPredicateB != nil)) ? optionalPredicateB!(obj) : true

您可以在此處找到infix運算符的Swift列表。 它們按降序排列。

在這條線

return predicateA(obj) 
      && optionalPredicateB != nil ? optionalPredicateB!(obj) : true

編譯器正在

predicateA(obj) 
      && optionalPredicateB != nil

作為三元條件的一個原因,這就是為什么它不起作用的原因,所以現在您添加了大括號以使其正常工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM