【问题标题】:Bug in Swift array subscript indexing?Swift 数组下标索引中的错误?
【发布时间】:2014-12-02 08:49:09
【问题描述】:

我已经从我的项目中分离出一些可以粘贴到 Playground 中的 Swift 代码。它会在正常的 Xcode 编辑和 Playground 中产生错误“找不到接受提供的参数的 '+' 的重载”。错误指的是最后(非平凡)行。

import UIKit

let points = 40
let max = points-1

let L = 10.0
let Deltat = 0.01
let Deltax = L/Double(points)

var a = [Double](count: points, repeatedValue: 0.0)
var b = [Double](count: points, repeatedValue: 0.0)
var c = [Double](count: points, repeatedValue: 0.0)

for i in 1..<max-1
{   //let iPlus1 = i+1
    //let temp = 0.5*Deltat/Deltax
    c[i] = 0.5*(a[i+1] + a[i-1]) + 0.5*Deltat/Deltax * (b[i+1] - b[i-1])
}

如果我取消注释“let iPlus1...”这一行并进行以下编辑,Swift 会接受该代码。

{   let iPlus1 = i+1
    //let temp = 0.5*Deltat/Deltax
    c[i] = 0.5*(a[iPlus1] + a[i-1]) + 0.5*Deltat/Deltax * (b[i+1] - b[i-1])
}

如果我取消注释“let temp...”这一行并进行以下编辑,Swift 将再次接受该代码。

{   //let iPlus1=i+1
    let temp = 0.5*Deltat/Deltax
    c[i] = 0.5*(a[i+1] + a[i-1]) + temp * (b[i+1] - b[i-1])
}

这些修改对我来说都没有任何意义,因为两者都是看似微不足道的替换。我知道 Swift 永远不会为我隐式类型转换。在原始代码中似乎没有尝试任何隐式类型转换——所有 Ints 和 Doubles 都按预期声明。我开始相信这是 Swift 数组下标索引的错误。

【问题讨论】:

  • 如果你把这些添加的括号括起来会发生什么?例如a[(i+1)]+ (0.5*Deltat/Deltax) ?
  • 在发布原始问题之前,我实际上已经尝试过您的建议。这些建议都不能解决问题。即使他们这样做了,它仍然会提示一个错误。
  • 哦,我绝对同意存在错误,我只是好奇。 :)

标签: ios arrays swift swift-playground subscript-operator


【解决方案1】:

这是一个已知的 swift 错误:长语句会产生奇怪的编译错误。 只需将您的行分成 2 行,例如:

c[i] = 0.5*(a[i+1] + a[i-1])
c[i] += 0.5*Deltat/Deltax * (b[i+1] - b[i-1])

我发现在同一行中有超过 4 或 5 个算术运算会发生这种情况,但这不是规则,只是在某些表达式类型中找到的数字 - 在其他情况下可能会有所不同。

看这个问答的例子:Xcode Beta 6.1 and Xcode 6 GM stuck indexing for weird reasonXcode 6 with Swift super slow typing and autocompletion(最后一个实际上会导致缓慢,但以相同的方式解决,所以根可能相同)

【讨论】:

  • 在我的调试中,我实际上遇到了您建议的解决方案。为简洁起见,我并未将其列为解决方案。我也很清楚 Swift 编译我非常短而简单的代码花费了非常长的时间。验证这些错误非常有帮助,尽管它提出了我是否应该继续使用 Swift 的难题。
  • 关于你的顾虑,如果你以后想为 iOS 或 Mac 开发,你别无选择,只能使用 Swift。问题可能是:我应该现在开发还是等待它更稳定?
  • 是的,这是我真正的问题。你说得对,斯威夫特不会消失。 ...回到最初的问题 - 似乎 any 尝试减少相关行中的操作数量是一种潜在的解决方法。 iPlus1 解决方案的奇怪之处在于它降低了独立于 Double 算法的复杂性。这表明这个问题是一个基本的解析问题——很难相信它能够存活到 v1.0。
  • 是的,这很奇怪 - 这是一个已知问题,我从 beta 3 开始就经历过,但我怀疑它从第 0 天就已经存在。也许它太复杂而无法及时解决,或者它需要对编译器进行了重大更改,它们只是从 beta 推迟到 beta(包括 1.0,在我看来,它仍然是 beta :))
猜你喜欢
  • 2018-01-28
  • 1970-01-01
  • 1970-01-01
  • 2016-08-26
  • 2021-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多