TL; DR
Почему это не работает?
"abcdefg".characters.map(String.init) // error: type of expression is ambiguous without more context
Подробнее
Одна из самых классных вещей, которые мне нравятся в Swift, - это возможность конвертировать коллекцию одной вещи в другую, передавая метод init (предполагая, что существует init()
для этого типа).
Здесь приведен пример преобразования списка кортежей в экземпляры ClosedInterval
.
[(1,3), (3,4), (4,5)].map(ClosedInterval.init)
В этом примере также используется тот факт, что мы можем передать кортеж аргументов как один аргумент, если кортеж соответствует списку аргументов функции.
Вот еще один пример, на этот раз преобразование списка чисел в строковые экземпляры.
(1...100).map(String.init)
К сожалению, следующий пример не работает. Здесь я пытаюсь разделить строку на список односимвольных строк.
"abcdefg".characters.map(String.init) // error: type of expression is ambiguous without more context
map()
должен работать в списке Character
(и действительно, я смог проверить на игровой площадке, что Swift указывает правильный тип [Character], который передается в map
).
String
определенно может быть создан из Character
.
let a: Character = "a"
String(a) // this works
И интересно, это работает, если каждый из символов находится в своем собственном массиве.
"abcdefg".characters.map { [$0] }.map(String.init)
Или эквивалент:
let cx2: [[Character]] = [["a"], ["b"], ["c"], ["d"]]
cx2.map(String.init)
Я знаю, что могу это сделать:
"abcdefg".characters.map { String($0) }
Но я специально пытаюсь понять, почему "abcdefg".characters.map(String.init)
не работает (IMO этот синтаксис также более читабельный и элегантный)