2017-06-05 51 views
1

我可能有這個錯誤。菜鳥。我在這裏重新創建了我在操場類型環境中所做的事情。基本上,發件人是其他滑塊的UITableView中的滑塊。 myData是底層數據。除了對應於發件人項目的數據之外,我想對所有基礎數​​據的項目進行計算。我不知道我的閉包語法是否正確。這是我第一次創建一個。Swift過濾器和映射結​​構數組

// sender comes over as a struct 
struct myStruct { 
    var tag: Int = 0 
    var value: Float = 0 
} 
let sender = myStruct(tag: 1, value: 199) 

// some vars for the calculation 
let globalTotal: Float = 597 
let globalAnotherTotal: Float = 0 

// an array of data structs 
struct myDataStruct { 
    var name: String = "" 
    var value: Float = 0 
} 
var myData: [myDataStruct] = [] 
myData.append(myDataStruct(name: "Tom", value: 45.0)) 
myData.append(myDataStruct(name: "Dick", value: 16.4)) 
myData.append(myDataStruct(name: "Harry", value: 12.3)) 

// a closure to do the calculation 
var calcOtherVals: (Float, Float) -> (Float) = { (startVal, senderStartVal) in 

    let remainingStartVals = globalTotal - senderStartVal 
    let remainingNewVal = globalTotal - sender.value - globalAnotherTotal 

    let endVal = ((startVal * (100/remainingStartVals))/100) * remainingNewVal 

    return endVal 
} 

// now need to perform calcOtherVals on all the .value floats in myData EXCEPT the element at position sender.tag hopefully using filter and map 

所以基本上我試圖使用過濾器和映射和calcOtherVals閉包來編輯結構數組。我可以用條件和循環以及calcOtherVals作爲函數來做到這一點沒有問題。只是希望更優雅地做。

問題:與代碼註釋一樣,我需要對myData中的所有.value浮點數執行calcOtherVals,除了位置sender.tag處的元素外。怎麼樣?

+1

我認爲我沒有弄清楚,你想映射'myData'並過濾它以獲取基於什麼的所有數據? 'myDataStruct'沒有'tag'屬性。你能詳細說明一下嗎? –

回答

1
myData.enumerated().flatMap { (index, element) in return index != sender.tag ? calcOtherVals (element.value) : nil } 

幾位。首先,enumerate()返回一個元組數組,它​​包含元素和所述元素的索引。

Next flatMap()。這本質上是map,但它忽略了任何解析爲零的變換。非常適合從可選數組轉換爲平面數組,如果您希望執行諸如此類的映射+過濾操作,這也非常棒。

- 更新 -

如果您熟悉隱含參數,可以進一步降低它:

myData.enumerated().flatMap { $0.offset != sender.tag ? calcOtherVals ($0.element.value) : nil } 
+0

這不是類型推斷,這是隱含的參數。類型推斷正在進行,因爲你從不指定任何類型。 –

+0

對嗎,謝謝@MichaelMorris – XmasRights

1

所以我的理解,你需要篩選陣列 像

let filteredData = myData.filter({$0.tag != sender.tag}) 

然後使用減少到這裏計算的迅速魔法

let sumAll = filterdData.reduce(0, {$0.value + $1.value}) 
+0

所以你說我需要添加一個標籤/ ID值到myData結構? – Sean

+0

是的,可以識別的東西。 如果你的值是唯一的,例如它在[0 ... 100] 之間,那麼你不需要額外的字段,你可以使用值作爲標籤 –