Swift实现:从字符串数组随机选取元素生成单元素数组
如何实现从Swift字符串数组返回随机单元素数组?
需求
编写Swift函数,从字符串数组allFruits中随机选取一个元素,返回仅包含该元素的单元素数组。
目标示例:
let allFruits:[String] = ["Apples", "Oranges", "Pears", "Grapes", "Bananas"] let randomFruit = ["Apples"] // 随机返回数组中的某一个元素组成的单元素数组
现有代码及报错
let allFruits:[String] = ["Apples", "Oranges", "Pears", "Grapes", "Bananas"] func randomFruit(arraySource:[String]) -> [String]{ let randomItem = arraySource.randomElement() var singleArray:[String] = [] return singleArray.append(contentsOf: randomItem) }
调用randomFruit(arraySource: allFruits)时触发错误:
Cannot convert return expression of type '()' to return type '[String]'
问题分析
append(contentsOf:)是无返回值的方法(返回类型为Void,即()),你试图直接返回这个方法的执行结果,而不是最终的数组,这就造成了类型不匹配。arraySource.randomElement()返回的是Optional<String>,如果传入的数组为空,该方法会返回nil,必须处理这个可选值,否则会引发编译或运行时问题。
解决方案
方案一:简洁构造数组(推荐)
直接通过可选绑定获取随机元素,然后构造单元素数组返回,同时处理空数组的边界情况:
let allFruits:[String] = ["Apples", "Oranges", "Pears", "Grapes", "Bananas"] func randomFruit(from arraySource: [String]) -> [String] { guard let randomItem = arraySource.randomElement() else { // 数组为空时返回空数组,也可根据需求抛出错误或返回默认值 return [] } return [randomItem] } // 调用示例 let result = randomFruit(from: allFruits) print(result) // 输出类似 ["Grapes"] 的随机结果
方案二:基于原思路修改
如果想保留“先初始化数组再添加元素”的逻辑,可调整为:
func randomFruit(from arraySource: [String]) -> [String] { var singleArray: [String] = [] if let randomItem = arraySource.randomElement() { singleArray.append(randomItem) } return singleArray }
关键要点
- 永远不要忽略
randomElement()的可选性:空数组场景必须处理,避免崩溃或编译错误。 append()/append(contentsOf:)仅负责修改数组,没有返回值,不能直接作为返回语句的内容。- 直接构造
[randomItem]是最简洁高效的实现方式,无需额外的数组初始化和添加操作。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

