Приведение массива <Any>к массиву <Int>в Swift - PullRequest
0 голосов
/ 13 марта 2019

У меня есть массив объектов Any, называемых временными метками, в которых первый объект является строкой, а остальные объекты - Int. То, что я хочу, это чтобы отбросить первый элемент и обрабатывать оставшуюся часть массива как массив объектов Int ..

Я пытался:

let timestamps = xAxisData.dropFirst()
if let timestamps = timestamps as? Array<Int> { 
}

Он компилируется, но говорит - Cast from 'ArraySlice<Any>' to unrelated type 'Array<Int>' always fails

Я мог бы перебрать массив и создать новый временный массив с проверкой каждого элемента, является ли он Int или нет, но я думаю, что есть лучший более чистый способ?

Ответы [ 3 ]

2 голосов
/ 13 марта 2019

Вам необходимо создать Array из ArraySlice, созданного dropFirst.

let timestamps = Array(xAxisData.dropFirst())
if let timestamps = timestamps as? [Int] { 
}
1 голос
/ 13 марта 2019

Мне нравится использовать что-то вроде flatMap, поэтому, независимо от того, находятся ли значения не-Int в массиве, они не учитываются в результирующем массиве.

let originalArray:[Any] = ["No int", 2, 3, "Also not int", 666, 423]
let intArray:[Int] = originalArray.flatMap { $0 as? Int }
print(intArray)

Напечатает это:

[2, 3, 666, 423]

Так что в вашем случае вы могли бы сделать что-то вроде:

let timestamps = xAxisData.flatMap { $0 as? Int }

Как сказал Стив Мэдсен в комментарии ниже, если вы используете Swift 4.1 или новее, Apple рекомендует использовать compactMap для избавления от необязательных nils, так что конкретное использование flatMap не рекомендуется.

let timestamps = xAxisData.compactMap { $0 as? Int }
1 голос
/ 13 марта 2019

Вот еще один метод для преобразования подмножества массива со смешанными типами во что-то более конкретное:

let intArray = anyArray.compactMap { $0 as? Int }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...