我有一个名为timestamps的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,但是我认为有更好的更清洁的方法吗?
答案 0 :(得分:2)
您需要根据Array
创建的ArraySlice
创建一个dropFirst
。
let timestamps = Array(xAxisData.dropFirst())
if let timestamps = timestamps as? [Int] {
}
答案 1 :(得分:1)
这是将混合类型的数组的子集转换为更特定的内容的另一种方法:
let intArray = anyArray.compactMap { $0 as? Int }
答案 2 :(得分:1)
我喜欢使用诸如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 }
正如史蒂夫·马德森(Steve Madsen)在下面的评论中所述,如果您使用的是Swift 4.1或更高版本,苹果建议使用compactMap
来摆脱可选的nil,从而弃用flatMap
的特定用途。 / p>
let timestamps = xAxisData.compactMap { $0 as? Int }