我正在将我的代码转换为Swift 3,只剩下3个构建时错误,其中2个与我不了解范围现在是如何工作有关。例如,我有:
func shuffle( _ tenseArray: [ Tense ], ...
var indices = [ Int ]()
for tense in tenseArray {
if let aRange = tenseRange[ tense ] {
indices.append( aRange )
}
}其中Tense是一个类似于以下内容的枚举:
enum Tense: String {
case IndicativePresent = "Indicative Present"
case IndicativePreterite = "Indicative Preterite"
case IndicativeImperfect = "Indicative Imperfect"
...tenseRange的定义为:
var tenseRange: [ Tense : ClosedRange<Int> ] = [:] // maps Tense enums to ranges of tense indices人口是这样的:
tenseRange[ Tense.IndicativePresent ] = ( 11 ... 16 )
tenseRange[ Tense.IndicativePreterite ] = ( 17 ... 22 )
tenseRange[ Tense.IndicativeImperfect ] = ( 23 ... 28 )
...用于func shuffle中的行
indices.append( aRange )我得到的错误是不能用'CountableRange'类型的索引订阅'Int‘类型的值。我真的很想把这些范围转换成ints,以便在数组的索引中使用,就像我以前在Swift中所做的那样,但是我似乎不知道怎么做。有什么想法吗?
提前感谢!
发布于 2016-11-03 12:50:43
您将您的indices声明为Array of Int,因此不能将append(_:)用于ClosedRange<Int>。
因此,我假设您希望将ClosedRange中的所有值附加到indices中。
在这种情况下,您可能需要使用append(contentsOf:),而不是append(_:)。
..。 函数附加(元素) 在数组末尾添加一个新元素。 ..。 函数附录(contentsOf: C) 将集合的元素添加到数组的末尾。 函数附录(contentsOf: S) 将序列的元素添加到数组的末尾。
不幸的是,在Swift 3中,CountableRange<T>既不是集合也不是序列。
但是Swift 3引入了一个新的范围族类型,CountableClosedRange<T>和CountableRange<T>,它们都是Collection。结果类型的封闭范围运算符...可以是一个CountableClosedRange<T>当放置在一个特定的上下文。
indices.append(contentsOf: aRange.lowerBound...aRange.upperBound)否则,您可以将tenseRange的值声明为CountableClosedRange<Int>。
var tenseRange: [ Tense : CountableClosedRange<Int> ] = [:]https://stackoverflow.com/questions/40380391
复制相似问题