2016-03-24 36 views
3

什麼是最方便的代碼編寫如何在Swift中編寫array.valueForKey?

[results valueForKey:@"attribute"] 

在迅速? 我發現here,它的推薦使用地圖()函數與閉合:

swiftarray.map({$0["attribute"]}) 

注: swiftarray不是NSArray的

+0

出於某種原因,我的電腦已經決定不再想運行任何Swift代碼(有用...),但我敢肯定你可以運行這只是從它刪除括號?我想可能兩種方法都是有效的。你在操場上試過這個嗎? TBH,我看不出你得到的錯誤與你發佈的代碼有關嗎?它絕對是來自它嗎? – Fogmeister

+0

你可以發佈整個用例嗎?你的陣列是什麼類型? – Sulthan

+1

@Fogmeister「我的電腦已經決定不再想運行任何Swift代碼」哇,我想我想聽聽更多關於_that_! – matt

回答

5

我'不知道,但如果你有比陣列詞典(或支持下標其他類型的)一些其他的對象,你將需要使用下面的代碼

results.map({$0.attribute}) 
+0

我實際上得到的錯誤消息:「AnyObject」沒有成員「屬性名稱」 – aneuryzm

+0

然後,您需要將AnyObject轉換爲包含在結果數組中的真實對象類型 –

+0

這意味着我不能使用簡潔的關閉你在你的答案中寫道,因爲我需要在閉包的簽名中指定參數的類型 – aneuryzm

-1

什麼是最方便的代碼寫

[results valueForKey:@"attribute"] 

在swift?

這將是:

results.valueForKey("attribute") 
+1

對於自定義對象數組,我得到錯誤'Value of type'[TestObject]'has no member'valueForKey'' –

+1

@JamesWebster很明顯,您發送的對象'valueForKey'需要是一個派生自NSObject的類,因爲這就是'valueForKey'所在的地方。如果你有一個數組,它需要是一個NSArray,它的元素需要是NSObject的衍生物。但這不是OP所要求的(據我所知)...或者是這樣嗎? – matt

+2

@Matt爲什麼你認爲數組是從NSObject派生的?這是一個快速數組,而不是NSArray。我也收到消息沒有成員'valueForKey'。否則,這個問題將是一個非常愚蠢的問題。 – aneuryzm

0

類是否有一個標?

我已經能夠創建一個測試類可以使用KVC訪問器,像這樣:

class TestObject 
{ 
    var name:String 
    var numbers:[String:Int] = [String:Int]() 

    init(name:String) 
    { 
     self.name = name 
    } 

    subscript(index: String) -> Int? { 
     get { 
      return numbers[index] 
     } 
     set(newValue) { 
      numbers[index] = newValue 
     } 
    } 
} 

用下面的代碼進行測試:

let testObject1 = TestObject(name: "test1") 
testObject1["home-phone"] = 1234 
testObject1["mobile-phone"] = 5678 

let testObject2 = TestObject(name: "test2") 
testObject2["office"] = 0987 
testObject2["mobile-phone"] = 6543 

let array : [TestObject] = [testObject1, testObject2] 

var results = array.map({$0["office"]}) 
print("Results:\(results)") 

results = array.map({$0["mobile-phone"]}) 
print("Results:\(results)") 

產生以下結果:

Results:[nil, Optional(987)] 
Results:[Optional(5678), Optional(6543)] 
相關問題