Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在swift中转换混合大小整数数组_Swift_Type Conversion_Integer - Fatal编程技术网

如何在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

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]) -> [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谢谢,我想我明白了!