Swift中调用stride遍历Strideable类型为何编译报错?
解决Swift中stride函数参数类型不匹配的错误:Cannot invoke 'stride' with argument list of type '(from: MyType, to: MyType, by: MyType)'
这个错误的核心原因是你混淆了stride函数的by参数类型要求,咱们一步步拆解问题本质和解决方案:
问题根源
你定义的MyType是UInt64的别名,而UInt64虽然遵循Strideable协议,但它的关联类型Stride并不是自身——因为步长可能是正数也可能是负数,无符号整数没法表示负步长,所以Swift为UInt64指定了有符号的Int64作为步长类型。
你调用stride(from:a, to:b, by:c)时,c的类型是MyType(即UInt64),但函数要求by参数的类型是T.Stride(也就是Int64),类型不匹配就触发了这个错误。
解决方案
把by参数的类型转换成Int64即可,有两种简单的实现方式:
方式一:直接转换步长变量
typealias MyType = UInt64 let a: MyType = 0 let b: MyType = 100 let c: MyType = 10 for i in stride(from: a, to: b, by: Int64(c)) { print(i) // 正常输出0,10,20...90 }
方式二:提前定义步长为Int64类型
如果步长本身不需要是无符号的,可以直接把c定义为Int64类型,避免转换步骤:
typealias MyType = UInt64 let a: MyType = 0 let b: MyType = 100 let c: Int64 = 10 // 直接使用Stride对应的类型 for i in stride(from: a, to: b, by: c) { print(i) }
额外验证
你可以在Playground里打印类型信息,确认UInt64的步长类型:
print(UInt64.Stride.self) // 输出:Int64
这能直观看到,UInt64的步长类型确实是Int64,而非它本身。
内容的提问来源于stack exchange,提问作者natevw
相关产品推荐
相关产品推荐

