2016-12-07 33 views
1

我知道,在第一線,我們可以使用lessThanTen(編號:智力)更換(INT),並contidion意味着一個標籤,但在第三行:*你爲什麼不我們使用如果條件:(項目)更換如果條件(項目),因爲條件是人亞伯。 enter image description here快速教程中的'條件'是什麼意思?

回答

3

condition是供給到hasAnyMatches需要被稱爲以產生一個布爾值的Bool -returning閉合。閉包採用類型爲Int的單個參數,它與list的元素類型相同。因此,我們致電提供的(Int) -> Bool封閉在每個項目,並在案件condition應用於一個項目返回true,我們削減了list短項目的遍歷和返回true從函數。

使用函數式編程tecniques,我們可以利用上list一個reduce操作來壓縮hasAnyMatches實現:

func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool { 
    return list.reduce(false) { $0 || condition($1) } 
} 

,或者甚至更好(允許出口return在原來的循環),如所描述通過@Hamish在初級講座的意見,使用contains

func hasAnyMatches(list: [Int], condition: (Int) -> Bool) -> Bool { 
    return return list.contains(where: condition) 
} 

用法示例(謝謝!):

func lessThanTen(number: Int) -> Bool { 
    return number < 10 
} 

var numbers = [20, 19, 7, 12] 
print(hasAnyMatches(list: numbers, condition: lessThanTen)) // true 
+1

請注意,在這種情況下使用'contains(where:)'會比'reduce'更好,因爲它會在發現'true'時早返回(你也可以說'return list.contains(where:condition )')。儘管我們現在真的已經達到了'hasAnyMatches'函數從實際角度來說完全是冗餘的地步;) – Hamish

+0

@Hamish真的,完全忘了'contains',在這裏更好,也更好地反映了原來的'for'循環。作爲一個方面說明,我相信'減少'也會導致短路,我記得對此進行了測試(但是使用了一些不尋常的布爾計算),但自然'contains'更適合於這個目的,這要感謝反饋! – dfri

+0

沒問題:)只是好奇,你是怎麼想'減少'到短路?我能想到的唯一方法就是定義一個自定義的'Error'類型,並將其從傳遞給'reduce'的函數中拋出(然後在調用者端捕獲並返回) – Hamish

6

條件是,你在這個方法接收的方法,如果你看一下該方法的簽名:

condition: (int) -> Bool 

這意味着您收到一個可以使用的參數來調用條件的Int類型,並會返回一個布爾值。在任何地方,裏面:

hasAnyMatches 

你,如果你看一下方法調用者可以使用

condition(anyInt) 

現在:

hasAnyMatches(list: numbers, condition: lessThanTen) 

所以,你說'hasAnyMatches'上的'條件'將會'lessThanTen'。這意味着,在您的

if condition(item) 

什麼是真正的情況是:

if lessThanTen(item) 

我希望它使人們更清楚!

+0

爲什麼我們可以用「lessThanTen」來代替「條件」?由於「lessThanTen」是一個功能標題,但「條件」是標籤。 – jack

+0

由於在第一行中,「條件」代表標籤。你知道第三行中的「條件」是什麼意思嗎?如果它代表一個標籤,爲什麼我們不在後面使用「:」。或者我們不使用它,因爲它是我們可以忽略它的一條規則?另一方面,我們知道:在第一行中:(int)代表一個函數,這裏是「lessThanTen」,第三行中的(item)也代表一個函數,爲什麼我們不改變「條件(項目)「變成」(項目)「? – jack