You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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数据

你当前的传值逻辑有误,应该传递整个模型数组而非零散的单个字符串:

  1. 先修改目标视图控制器的接收属性,删除原来四个String定义,改成接收模型数组:
// 目标ViewController中定义
var beatLoopsList: [BeatLoops] = []
  1. 修改上一级页面的传值逻辑,传入对应当前点击的pack关联的所有loop数组(如果你的beatAudioCollect就是当前pack对应的loop集合,直接传整个数组即可):
// 上一级didSelectRowAt中替换原来四个loops相关的传值代码
vc?.beatLoopsList = beatAudioCollect // 或传入当前pack对应的子loop数组
  1. 改写目标页的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 22:39:01