Swift报错'subscript(_:)不可用:无法用Int下标String,需用String.Index'如何解决
报错根本原因
目标视图控制器中你定义的loopsAudio、loopsDesc、loopsInst、loopsProd四个属性都是单个String类型,不是数组。你在上一级页面传值时也只是传递了对应行的单个字符串值,而非数组集合。但你在cellForRowAt方法中用了数组的下标语法[indexPath.row]去访问单个String,相当于尝试从字符串中取第N个字符,Swift不支持直接用Int作为String的下标,因此触发该报错。
解决方案
根据你的业务需求二选一即可:
场景1:目标页列表只展示1条数据(即上一级点击传入的单个loop信息)
直接删除下标访问语法,直接使用接收的变量赋值即可,同时需要保证numberOfRowsInSection代理返回1:
// 替换原来报错的四行代码 let beatDesc = loopsDesc let beatProd = loopsProd let beatAudio = loopsAudio let beatInst = loopsInst
场景2:目标页列表需要展示多条loop数据
你当前的传值逻辑有误,应该传递整个模型数组而非零散的单个字符串:
- 先修改目标视图控制器的接收属性,删除原来四个String定义,改成接收模型数组:
// 目标ViewController中定义 var beatLoopsList: [BeatLoops] = []
- 修改上一级页面的传值逻辑,传入对应当前点击的pack关联的所有loop数组(如果你的
beatAudioCollect就是当前pack对应的loop集合,直接传整个数组即可):
// 上一级didSelectRowAt中替换原来四个loops相关的传值代码 vc?.beatLoopsList = beatAudioCollect // 或传入当前pack对应的子loop数组
- 改写目标页的
cellForRowAt取值逻辑:
// 替换原来报错的四行代码 let currentLoop = beatLoopsList[indexPath.row] let beatDesc = currentLoop.name let beatProd = currentLoop.producer let beatAudio = currentLoop.loopPath let beatInst = currentLoop.instrument
优化建议
优先使用模型数组传递批量数据,不要零散传递多个独立的字符串属性,既可以减少冗余代码,也能避免类型不匹配的低级错误。
内容的提问来源于stack exchange,提问作者dextermikles
相关产品推荐
相关产品推荐

