gpt4 book ai didi

swift - 不能下标类型为 '[Int16]' 的值

转载 作者:搜寻专家 更新时间:2023-11-01 06:41:16 24 4
gpt4 key购买 nike

相关代码如下:

/// 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]})
}

最佳答案

你的 decimateSamples方法必须采用 [Int16]数组作为它的参数。不幸的是,当您下标一个范围类似于 vowelPart 的数组时,你会得到一个 ArraySlice<Int16> , 不是相同类型的数组。简单的解决方案是将切片转换为新数组:

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

这最终会复制数组的内容,如果它是一个大型数据集,这就不好了。您可以改为让您的函数接受 ArrayArraySlice通过使其对任何类型的 CollectionType 通用.

关于swift - 不能下标类型为 '[Int16]' 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34973284/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com