如何解决Card数组洗牌时‘Argument type 'CustomStruct' does not conform to expected type 'Sequence'’错误
问题分析与解决方案
嗨,这个情况我之前也遇到过!其实Array.remove(at:)本身对任何元素类型的可变数组都能正常工作,包括自定义结构体——之所以你的Card数组会报错,大概率是因为你的洗牌逻辑里用到了其他依赖元素遵守特定协议的操作,而String刚好默认已经实现了这些协议,你的Card结构体却没有。
最常见的原因:缺少Equatable协议实现
Swift的String类型默认遵守了Equatable协议,但自定义结构体不会自动继承这个协议。如果你的洗牌代码里用到了需要Equatable的方法(比如contains(_:)、firstIndex(of:)这类判断元素相等的操作),编译器就会报错,可能你误把报错位置定位到了remove(at:)上。
解决方法
只需要让你的Card结构体遵守Equatable协议即可,分两种情况:
结构体属性都是基础类型/已遵守
Equatable的类型
Swift可以自动帮你合成Equatable的实现,不需要手动写任何额外代码:struct Card: Equatable { // 示例属性,根据你的实际情况调整 let suit: String let rank: Int }结构体包含自定义类型属性
如果你的Card里有自己定义的类型属性,需要手动实现==运算符来判断两个Card实例是否相等:struct Card: Equatable { let suit: String let rank: Int let customData: MyCustomType // 自定义类型属性 static func == (lhs: Card, rhs: Card) -> Bool { // 逐一比较所有属性的相等性 return lhs.suit == rhs.suit && lhs.rank == rhs.rank && lhs.customData == rhs.customData } }
额外排查点
如果上面的方法没解决问题,可以检查一下你的cards数组是不是用let声明的不可变数组——如果是,不管元素是什么类型,调用remove(at:)都会报错,但你说String数组能正常运行,这个可能性应该不大。
内容的提问来源于stack exchange,提问作者jackxujh
相关产品推荐
相关产品推荐

