Создание Dictionary из массива


#1

Привет! Вопрос вроде бы простой, но тем не менее… Необходимо создать Dictionary типа [String: [Any]] из имеющихся [String] и [Any]:

let s = ["first", "second", "third"]
let a = [1, 2, 3]

let d = Dictionary... 
// в результате должна получится матрица: "first": [1, 2, 3], "second": [1, 2, 3], "third": [1, 2, 3]

Второй вопрос: как сделать проверку? например if $0 == “first” { return a[0] }


#2
let s = ["first", "second", "third"]
let a = [1, 2, 3]

var d: Dictionary<String, Any> = [:]

s.forEach { d[$0] = a }

d.forEach { if $0.key == "first" { print($0.value) } }

P.S. способ проще и быстрее для поиска ключа

if let value = d["first"] {
    print(value)
}

#3
let s = ["first", "second", "third"]
let a = [1, 2, 3]

let result = zip(s, [[Int]](repeating: a, count: s.count)).reduce(into: [String: [Int]]()) { $0[$1.0] = $1.1 }
print(result)

#4

:slight_smile: может не стоит загружать новичков такими методами :smiley:
я бы расценивал это как некий троллинг :slight_smile:


#5

На самом деле что-то подобное мне и хотелось увидеть (отдельную переменную для словаря не хотелось создавать, тк словарь передается в функцию). Только возможно ли это сделать через Dictionary.init ?


#6

Я так пишу, попроще вы предложили, пусть будет разнообразие)))


#7

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


#8

Кстати можно:

let s = ["first", "second", "third"]
let a = [1, 2, 3]

let dict = Dictionary(uniqueKeysWithValues: zip(s, [[Int]](repeating: a, count: s.count)))
print(dict)

Или проще:

Dictionary(uniqueKeysWithValues: zip(s, [a, a, a]))

#9

Я имел ввиду, что можно вызвать сразу myFunc(zip(s, [[Int]](repeating: a, count: s.count)).reduce(into: String: [Int]) { $0[$1.0] = $1.1 })


#10

Я думаю вам так же стоит почитать про чистый код.
В функцию не принято передавать какое-то действие, можно передать результат этого действия, но его нужно получить заранее либо в другой функции и передать уже эту функцию как входной параметр в первой функции.


#11

Почему это? Я думал это называется композиция.


#12

Согласен, что очень замороченное действие)) поэтому и хотелось что-то вроде Dictionary(uniqueKeysWithValues: zip(s, [a, a, a]))


#13

т.е. по вашему такая форма вызова метода очень красивая и понятна?
а если метод принимает енсколько вычисляемых параметров?

композиция мне казалось это что-то вроде такого

func1() -> result {}
func2(func1(), …)


#14
myFunc(zip(s, [[Int]](repeating: a, count: s.count)).reduce(into: String: [Int]) { $0[$1.0] = $1.1 })

Тут тоже функция передается в функцию.

Дело привычки.

myFunc(
    zip(s, [[Int]](repeating: a, count: s.count)).reduce(into: String: [Int]) { $0[$1.0] = $1.1 },
    zip(s, [[Int]](repeating: a, count: s.count)).reduce(into: String: [Int]) { $0[$1.0] = $1.1 }
)

#15

видимо у нас разные понятия о чистоте кода ))


#16

Я FP люблю. [20 символов]


#17

я о личном не писал бы на форуме :smiley:


Закрыл тему #18