2016-01-24 53 views
1

下面是相关的代码:不能下标类型的值“[Int16类型]”

/// Individual audio samples 
let samples: [Int16] 

/// The rates in Hz 
let sampleRate: Int 

/// The part of the audio which is a vowel utterance 
lazy var vowelPart: Range<Int> = { 
    let strongPart = SpeechAnalyzer2.findStrongPartOfSignal(self.samples, withChunks: 300, sensitivity: 0.1) 
    let clippedPart = SpeechAnalyzer2.truncateTailsOfRange(strongPart, portion: 0.15) 
    return clippedPart 
}() 

private lazy var vowelSamplesDecimated: [Int16] = { 
    let out = SpeechAnalyzer2.decimateSamples(self.samples[self.vowelPart], withFactor: 4) 
    return out 
}() 

out = ...线在底部给出了错误:

cannot subscript a value of type '[Int16]'

首先,如何是这样的错误信息甚至是有效的(当然你可以下标一个数组!)。其次,我该如何解决这个问题呢?


更新,接受Nate的回答后,这里是我如何更新下游功能是通用的CollectionType以供将来参考:

/// Select the first of every `factor` items from `samples` 
class func decimateSamples<T: CollectionType where T.Index: Strideable>(samples: T, withStride stride: T.Index.Stride) -> Array<T.Generator.Element> { 
    let selectedSamples = samples.startIndex.stride(to: samples.endIndex, by: stride) 
    return selectedSamples.map({samples[$0]}) 
} 
+0

什么是完整的错误信息?通常在'can not subscript'后面有' – Cristik

+0

'类型的索引,我昨天发生了类似的错误,我认为它可能与你传递的函数有关。 –

+0

@Cristik这是*整个*错误信息,这就是我的要求 –

回答

3

decimateSamples方法必须采取[Int16]数组作为它的参数。不幸的是,当你为vowelPart这样的范围下标一个数组时,你会得到一个ArraySlice<Int16>,而不是相同类型的数组。最简单的办法是你的片转换成一个新的数组:

... decimateSamples(Array(self.samples[self.vowelPart]), withFactor: 4) ... 

这结束了复制的数组,如果它是一个大的数据集这是不好的内容。您可以通过使其功能接受ArrayArraySlice,使其适用于任何类型的CollectionType

+0

谢谢!是的,表现是一个问题。我刚刚学会了Swift泛型,并将其实施到下游(基本上只是深入到地狱的下一级)。根据您的首选建议,可以避免在此阶段重复阵列。 (解决方案附加到问题中。) –

+0

当然,编译器错误可能会大大改善。我认为ArraySlice 的逻辑与Array 类似,只是打印为[Int16]。这种过于简单化就是开始了这整个学习经历。 –

相关问题