如何在swift中转换混合大小整数数组
Swift 5,iOS 14 我在Swift中玩过泛型,试图理解它们,并提出了一个似乎无法解决的问题。假设我有一个混合大小的整数数组如何在swift中转换混合大小整数数组,swift,type-conversion,integer,Swift,Type Conversion,Integer,Swift 5,iOS 14 我在Swift中玩过泛型,试图理解它们,并提出了一个似乎无法解决的问题。假设我有一个混合大小的整数数组 var dindex = [Int8(1),Int16(2),Int32(3),Int64(4)] as [Any] 我想把它们转换成一个双精度数组来处理。现在map不起作用,我也不能,它似乎只是简单地通过数组,我在这一点上没有泛型的运气 // does not work func convertMap(qindexIn qindexOut:[Int]) -&g
var dindex = [Int8(1),Int16(2),Int32(3),Int64(4)] as [Any]
我想把它们转换成一个双精度数组来处理。现在map不起作用,我也不能,它似乎只是简单地通过数组,我在这一点上没有泛型的运气
// does not work
func convertMap(qindexIn qindexOut:[Int]) -> [Double] {
return(qindexOut.map({ Double($0) }))
}
// does not work
func convertMap22(qindexIn qindexOut:[Any]) -> [Double] {
let foo:[Double] = []
for i in qindexOut {
foo.append(Double(i))
}
return(foo)
}
// does not work
func convertMap2<T: BinaryInteger>(qindexIn qindexOut:[T]) -> [Double] {
return(qindexOut.map({ Double($0) }))
}
// this doesn't work either
func convertMap22(qindexIn qindexOut:[Any]) -> [Int] {
return(qindexOut.compactMap { $0 as? Int })
}
//不起作用
func convertMap(qindexIn qindexOut:[Int])->[Double]{
return(qindexOut.map({Double($0}))
}
//不起作用
func convertMap22(qindexIn qindexOut:[任何])->[双精度]{
让foo:[加倍]=[]
因为我在外面{
foo.append(双(一))
}
返回(foo)
}
//不起作用
func convertMap2(qindexIn qindexOut:[T])->[Double]{
return(qindexOut.map({Double($0}))
}
//这也不行
func convertMap22(qindexIn qindexOut:[任何])->[Int]{
返回(qindexOut.compactMap{$0 as?Int})
}
事实上,大部分代码甚至没有编译。这里的诀窍是什么?这肯定是可能的?这会奏效的。我将任何类型转换为Int类型
func convertMap22(qindexIn qindexOut:[Any]) -> [Double] {
var foo:[Double] = []
for i in qindexOut {
if let intValue = i as? Int{
let doubleValue = Double(intValue)
foo.append(doubleValue)
}else if let intValue = i as? Int8{
let doubleValue = Double(intValue)
foo.append(doubleValue)
}else if let intValue = i as? Int16{
let doubleValue = Double(intValue)
foo.append(doubleValue)
}else if let intValue = i as? Int32{
let doubleValue = Double(intValue)
foo.append(doubleValue)
}else if let intValue = i as? Int64{
let doubleValue = Double(intValue)
foo.append(doubleValue)
}
}
return(foo)
}
Swift中的任何都是很难处理的 请试试这个:
func convertMap(qindexIn qindexOut:[Any]) -> [Double] {
return(qindexOut.map{ ($0 as? NSNumber ?? NSNumber(0.0)).doubleValue })
}
希望有更好的方法。看着答案给了我一个想法,这个方法也很有效,虽然不是很快,但可能不太客观
func convertMap26(qindexIn qindexOut:[Any]) -> [Double] {
return(qindexOut.map{ Double("\($0)") ?? 0.0 })
}
我已经更新了答案。它会起作用,但我想Ooper解决方案更好。正如他们所说,这是一个很好的尝试,Ooper解决方案看起来非常客观。在理想的世界里,我不想求助于NSNumber。@user3069232,我同意。如果有更快捷的答案,请毫不犹豫地予以批准。我也很好奇。@OOPer,跟随你的线索,贴出了一个答案:)或者干脆
compactMap{Double(\($0)”)}
这取决于一个非数字是应该被转换成零还是被跳过有什么区别?compactMap是否更快?正如我所说,这取决于OP是想将“a”转换为零还是跳过它。在这种情况下,它们都是数字,这不会有什么区别,很可能是地图faster@LeoDabus谢谢,我想我明白了!