Swift编译报错Cannot find 'strideofValue' in scope及类型歧义问题如何解决
问题原因与修复方案
报错1:Cannot find 'strideofValue' in scope
strideofValue是Swift 3版本之前的旧全局函数,Swift 3正式发布后该函数已经被完全移除,官方替换方案为全局函数stride(ofValue:),或是更推荐的MemoryLayout系列静态属性。
报错2:替换为stride(ofValue:)后提示Type of expression is ambiguous without more context
stride(ofValue:)是泛型函数,返回值为对应类型的Stride关联类型,虽然绝大多数场景下该类型和Int等价,但编译器没有足够的上下文推断出你需要的类型恰好匹配sysctl函数要求的size参数类型,因此会抛出类型歧义错误,而非参数标签错误。
修复方案
和C系统API交互获取结构体内存步长的场景,更推荐使用MemoryLayout的静态属性,写法清晰无歧义,完全符合Swift交互规范,修复后的完整代码如下:
public static func isDebuggerAttached() -> Bool { var info = kinfo_proc() var mib : [Int32] = [CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()] var size = MemoryLayout<kinfo_proc>.stride let junk = sysctl(&mib, UInt32(mib.count), &info, &size, nil, 0) assert(junk == 0, "sysctl failed") return (info.kp_proc.p_flag & P_TRACED) != 0 }
如果你坚持要使用stride(ofValue:)的写法,只需要显式声明返回值类型即可解决歧义:
var size = stride(ofValue: info) as Int
内容的提问来源于stack exchange,提问作者Top-Master
相关产品推荐
相关产品推荐

