2014-11-17 4 views
-2

Первоначально у меня был список строк, которые, как я думал, были бы уникальными, поэтому я построил словарь и использовал этот список строк в качестве значений. Пример: [contact1,contact2,contact3]Можете ли вы использовать Массивы в качестве ключей в словарях?

Однако я понял, что строки не уникальны, но комбинация из двух строк. Пример: `[[контакт1, контакт1], [контакт1, контакт2], [контакт2, контакт2] ...]

Так как у меня есть 2 уникальных объекта, которые я хотел бы использовать в качестве ключей словаря, Я использую Arrays of Strings в качестве словарных ключей?

Предполагая, что я не могу, если мои строки не будут содержать запятую, я полагаю, я мог бы объединить их и разделить запятыми. Плохая идея?

+0

Вы попробовали? Сначала попробовать было бы намного лучше, чем задавать вопрос. – rmaddy

+3

Если вы попробовали это, то вы должны знать, работает оно или нет. И если вы знаете, зачем ставить вопрос? Я действительно пытаюсь понять этот вопрос. – rmaddy

ответ

2

Да:

let x = [["a1", "a2"]:"1", ["b1", "b2"]:"2"] 
println("x: \(x)") 

let v = x[["a1", "a2"]] as String 
println("v: \(v)") 

Выход:

 
x: { 
     (
     b1, 
     b2 
    ) = 2; 
     (
     a1, 
     a2 
    ) = 1; 
} 

v: 1 
+0

Проверьте тип на 'x': из-за моста Objective-C, который дает вам' NSDictionary', а не Swift' Dictionary'. –

-1

Я думаю, что это невозможно.

Вы можете использовать строку как contact1_contact1,contact1_contact2,contact2_contact2

2

Вы можете использовать любого Hashable типа в качестве словаря ключа - Swift встроенного Array типа не является хешей, но так как NSObject есть, а Swift массивы моста молча к массивам Objective-C, вы можете непреднамеренно использовать NSArray в качестве ключа.

+0

Да, правильно, но: «ну и что?» На самом деле нет такой вещи, как «Pure Swift», по крайней мере, еще нет, базовые классы Foundation по-прежнему необходимы, действительно базовые классы, такие как NSData. Команда Swift построила этот мост на языке Swift, поэтому я не вижу причин не использовать его. Мне не нужно заботиться о деталях внутренней реализации. – zaph

+0

Они разные, и нужно быть точными в отношении того, с чем мы работаем. Я не говорю, что использовать классы Foundation нецелесообразно, но использовать их, не понимая, что это то, что вы делаете, может помочь вам в решении проблем. –

+0

Swift скрывает эту деталь по дизайну, так что это деталь реализации. Можно сказать то же самое о переходе на CFString или любом из нескольких подкладок конкретных классов кластера классов. Что касается «проблем с дорогой», Apple должна предупредить там документацию об автоматическом приеме, но они этого не делают. Возможно, проблема в том, что String не является полным, что не является хешируемым типом. Мое предложение, если вы не хотите иметь два строковых класса, - использовать Objective-C. – zaph

Смежные вопросы