Swift中如何将for循环内的结果返回至循环外部?
嘿,我来帮你搞定这个Swift代码的问题~
解决循环内返回值收集到外部的问题
首先得指出你当前代码里的两个小问题:
- 循环范围用
0...pointTF.count会直接导致数组越界崩溃,因为数组索引是从0到pointTF.count - 1,正确的范围应该是0..<pointTF.count,或者更安全的直接遍历数组元素。 - 循环内部直接
return会让函数在第一次循环就终止,根本没机会处理后面的文本框,自然没法拿到所有结果。
核心思路:用数组统一收集结果
你需要先创建一个容器数组,把循环中每个文本框生成的CoachMark都存进去,等循环结束后再使用这个数组。
基础实现写法
let pointTF = [emailTF, passTF, resetEmailTF] // 创建数组存储所有生成的CoachMark(替换成你实际的类型) var coachMarks = [CoachMark]() // 直接遍历数组元素,比用索引更安全简洁 for textField in pointTF { let mark = coachMarksController.helper.makeCoachMark(for: textField) coachMarks.append(mark) } // 现在coachMarks数组里就有所有文本框对应的结果了,可在外部自由使用 return coachMarks
更简洁的函数式写法
如果你偏好Swift的函数式风格,用map可以一步完成遍历和转换,代码更紧凑:
let pointTF = [emailTF, passTF, resetEmailTF] let coachMarks = pointTF.map { textField in coachMarksController.helper.makeCoachMark(for: textField) } // 同样得到所有结果的数组 return coachMarks
补充:如果只需要单个结果的情况
要是你的需求其实是找到第一个符合条件的文本框并返回对应结果,那可以调整逻辑,但必须修正循环范围:
let pointTF = [emailTF, passTF, resetEmailTF] for i in 0..<pointTF.count { let mark = coachMarksController.helper.makeCoachMark(for: pointTF[i]) // 这里可以加判断条件,比如mark有效时再返回 return mark } // 处理无结果的情况 return nil // 或者返回默认的CoachMark实例
不过从你的描述来看,收集所有循环生成的返回值应该是你的核心需求,前两种方法完全可以满足~
内容的提问来源于stack exchange,提问作者Rob
相关产品推荐
相关产品推荐

