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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:58:37