【问题标题】:Array modification in loop循环中的数组修改
【发布时间】:2019-06-20 12:00:54
【问题描述】:

我正在开发一个命令行应用程序。第一个数组(称为 firstArray,是的)是用户通过 readLine() 输入的结果,它的所有元素都是 Double。现在我必须创建第二个数组,并将计算结果应用于我的第一个数组。一些结果是 NaN,三角计算的原因。我需要将所有 NaN 更改为字符串,但我收到错误“无法将类型 'String' 的值分配给类型 'Double'”。如何解决这个问题?

func calcLn () -> [Double] {

var calculatedArray = [Double]()

for item in firstArray {
    var result = log(Double((-100))/(cos(item)))
    calculatedArray.append(result)
}

for index in 0..<calculatedArray.count {
    if calculatedArray[index].isNaN {
    calculatedArray[index] = String("can't calculate")

【问题讨论】:

  • A String 不是 Double 并且不能这样保存。 Double.NaN 是一种让开发人员知道没有任何价值的方法。

标签: arrays swift loops types


【解决方案1】:

一个数组只能存储一种类型的东西。 calculatedArray只能存储Doubles,所以不能将其元素设置为Strings。

您可以创建一个名为outputArray 的新数组,它可以存储字符串,并将所有双精度数转换为字符串:

var outputArray = [String]()
for index in 0..<calculatedArray.count {
    if calculatedArray[index].isNaN {
        outputArray.append("can't calculate")
    } else {
        outputArray.append("\(calculatedArray[index])")
    }
}

您的calcLn 方法返回[Double],但您似乎想返回outputArray。如果是这种情况,您需要更改其签名以返回 [String]

请注意,您可以使用map 进行数组转换。这是您的代码的较短版本:

func calcLn () -> [String] {
    let calculatedArray = firstArray.map { log(100.0/cos($0)) }
    let outputStringsArray = calculatedArray.map { $0.isNaN ? "can't calculate" : "\($0)" }

    return outputStringsArray
}

【讨论】:

    猜你喜欢
    • 2021-08-03
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    相关资源
    最近更新 更多