2016-03-24 2 views
3

Какой самый удобный код для записиКак написать array.valueForKey в Swift?

[results valueForKey:@"attribute"] 

в стрижа? Я нашел here, что рекомендуется использовать функцию отображения() с крышкой:

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

нотабене swiftarray не NSArray

+0

Почему-то мой компьютер решил, что он больше не хочет запускать какой-либо код Swift (полезно ...), но я уверен, что вы можете ru n это и просто удалить из нее скобки? Я думаю, что оба способа действительны. Вы пробовали это на детской площадке? TBH, я не вижу, как ошибка, которую вы получаете, связана с кодом, который вы опубликовали? Это определенно от этого? – Fogmeister

+0

Не могли бы вы разместить весь прецедент? Какой тип вашего массива? – Sulthan

+1

@Fogmeister «Мой компьютер решил, что он больше не хочет запускать какой-либо код Swift». Вау, я думаю, мне хотелось бы больше узнать об этом _that_! – matt

ответ

5

I'am не уверен, но если у вас есть какой-либо объект в массиве, кроме словаря (или другого типа, который поддерживает индексацию), вам нужно будет использовать следующий код

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

На самом деле я получаю сообщение об ошибке: «AnyObject» не имеет имени «attribute-name» – aneuryzm

+0

. Затем вам нужно передать вам AnyObject в тип реального объекта, который содержится в вашем массиве результатов. –

+0

. Это означает, что я не могу использовать краткое закрытие вы написали в своем ответе, потому что мне нужно указать тип параметра в сигнатуре закрытия. – aneuryzm

-1

Какой самый удобный код для записи

[results valueForKey:@"attribute"] 

в быстром?

Это было бы:

results.valueForKey("attribute") 
+1

Для массива пользовательских объектов я получаю ошибку' Значение типа '[TestObject]' не имеет значения memberForKey'' –

+1

@JamesWebster Очевидно объект, который вы отправляете 'valueForKey' должен быть классом, производным от NSObject, потому что здесь живет' valueForKey'.Если у вас есть массив, он должен быть NSArray, а его элементы должны быть производными NSObject. Но это не то, о чем попросил ОП (насколько я могу судить) ... Или это? – matt

+2

@Matt Почему вы предполагаете, что массив является производным от NSObject? Это быстрый массив, а не NSArray. Я также получаю сообщение, у которого нет значения valueForKey. В противном случае вопрос был бы действительно глупым. – aneuryzm

0

ли ваш класс в индекс?

Я был в состоянии создать тестовый класс, который может использовать аксессор КВЦ как так:

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)] 
Смежные вопросы