在Swift中将Array <any>转换为Array <int>

时间:2019-03-13 17:10:35

标签: swift

我有一个名为timestamps的Any对象的数组,其中第一个对象是字符串,其余对象是I​​nt。我想要的是删除第一个元素,并将其余数组作为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 个答案:

答案 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 }