2016-03-07 92 views
0

我要證明,如果我的陣列篩選[字符串]]自定義範圍

let actualSigns = ["Aa", "Bb", "Cc"] 

...等於這一個內部的陣列中的一個......

var validSigns = [[String]]() 
validSigns.append(["Aa", "Bb", "Cc", "Dd"]) // want to match this 
validSigns.append(["Aa", "Bb", "Cc", "Xy"]) // ... and this 
validSigns.append(["Ee", "Ff", "Gg", "Hh"]) 

。 ..只比較actualSigns的對象數量。

所以在這種情況下,我想匹配validSigns中的第一個和第二個數組,因爲前三個值等於actualSigns

我試圖對其進行篩選

let range = Range(start: actualSigns.count, end: actualSigns.count+1) 
let match = validSigns.filter{ $0.removeRange(range) == actualSigns } 

但是編譯器說'$0 is a let constant'。我怎麼解決這個問題?

+0

是否爲了此事?單個數組中的每個元素是否都是唯一的?數組是否會始終處於相同的位置 - 即:總是在數組的開始還是結束? – ColGraff

回答

2

使用startsWith這樣的你想測試的陣列。

let match = validSigns.filter{$0.startsWith(actualSigns)} 

enter image description here

+0

有趣的是,之前沒有使用'startsWith()'。 – Eendje

+0

非常感謝Eric。工作非常好! – ixany

2

我不知道如果我理解正確的你,但你並不需要使用範圍得到匹配:

// My original answer 
let match = validSigns.filter { !zip($0, actualSigns).contains { $0.0 != $0.1 } } 

// Based on Price Ringo's answer 
let match = validSigns.filter { $0.startsWith(actualSigns) } 

輸出:

[["Aa", "Bb", "Cc", "Dd"], ["Aa", "Bb", "Cc", "Xy"]] 
+0

謝謝Eendje!你的原始答案也適用。 – ixany

0

您可以通過執行改正錯誤:

let match = validSigns.filter{ var input = $0; input.removeRange(range); return input == actualSigns } 

其他一些方法,只是爲了完整性:

import Foundation 

let actualSigns = ["Aa", "Bb", "Cc"] 
var validSigns = [ 
    ["Aa", "Bb", "Cc", "Dd"], 
    ["Aa", "Bb", "Cc", "Xy"], 
    ["Ee", "Ff", "Gg", "Hh"], 
    ["Ee", "Aa", "Bb", "Cc"]] // Added another case, to test when the matching array is not at the start 

let matches = validSigns.filter { $0.joinWithSeparator("").containsString(actualSigns.joinWithSeparator("")) } 
// => [["Aa", "Bb", "Cc", "Dd"], ["Aa", "Bb", "Cc", "Xy"], ["Ee", "Aa", "Bb", "Cc"]] 

let matches2 = validSigns.filter { Set($0).intersect(Set(actualSigns)).count == actualSigns.count } 
// => [["Aa", "Bb", "Cc", "Dd"], ["Aa", "Bb", "Cc", "Xy"], ["Ee", "Aa", "Bb", "Cc"]]