Strideable.distance(to : A) -> A.Stride 符合 Int64 + 124 的协议见证 - 此错误消息是什么意思?
protocol witness for Strideable.distance(to : A) -> A.Stride in conformance Int64 + 124 - what does this error message mean?
我的 ios swift 应用程序从 iTunesConnect 获得了一堆崩溃日志,堆栈跟踪的顶部显示了错误消息:
protocol witness for Strideable.distance(to : A) -> A.Stride in conformance Int64 + 124
这来自我的代码中无害的一行,如下所示:
if (var1 - var2 > MyClass.THRESHOLD) {
// Do something
}
var1
和 var2
被声明为 Int64
类型,而 THRESHOLD
是:
static let THRESHOLD = 900 * 1000
我有一种预感,这是因为 THRESHOLD
没有被声明为 Int64
,尽管我仍然没有关于这会如何导致问题的假设。另外,这个bug是不可复现的,所以我无法验证。
任何有关此错误消息含义的帮助,这里可能是什么问题?
混合类型比较可以
问题的原因。减法运算符是从
其操作数的类型为
@available(swift, deprecated: 3.0, obsoleted: 4.0, message: "Mixed-type subtraction is deprecated. Please use explicit type conversion.")
public func -<T>(lhs: T, rhs: T) -> T.Stride where T : SignedInteger
与 T == Int64
和 T.Stride == Int
。您的代码会导致带有 Xcode 8.3.2:
的警告消息
let THRESHOLD = 900 * 1000
let var1: Int64 = 0x100000000
let var2: Int64 = 0
// warning: '-' is deprecated: Mixed-type subtraction is deprecated. Please use explicit type conversion.
if var1 - var2 > THRESHOLD {
print("foo")
} else {
print("bar")
}
在 32 位设备上,差异对于 Int
来说可能太大了
上面的例子会因运行时错误而中止
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0)
frame #0: 0x0223d428 libswiftCore.dylib`protocol witness for Swift.Strideable.distance (to : A) -> A.Stride in conformance Swift.Int64 : Swift.Strideable in Swift + 72
解决方法是显式转换右侧:
if var1 - var2 > Int64(THRESHOLD) { ... }
我的 ios swift 应用程序从 iTunesConnect 获得了一堆崩溃日志,堆栈跟踪的顶部显示了错误消息:
protocol witness for Strideable.distance(to : A) -> A.Stride in conformance Int64 + 124
这来自我的代码中无害的一行,如下所示:
if (var1 - var2 > MyClass.THRESHOLD) {
// Do something
}
var1
和 var2
被声明为 Int64
类型,而 THRESHOLD
是:
static let THRESHOLD = 900 * 1000
我有一种预感,这是因为 THRESHOLD
没有被声明为 Int64
,尽管我仍然没有关于这会如何导致问题的假设。另外,这个bug是不可复现的,所以我无法验证。
任何有关此错误消息含义的帮助,这里可能是什么问题?
混合类型比较可以 问题的原因。减法运算符是从 其操作数的类型为
@available(swift, deprecated: 3.0, obsoleted: 4.0, message: "Mixed-type subtraction is deprecated. Please use explicit type conversion.")
public func -<T>(lhs: T, rhs: T) -> T.Stride where T : SignedInteger
与 T == Int64
和 T.Stride == Int
。您的代码会导致带有 Xcode 8.3.2:
let THRESHOLD = 900 * 1000
let var1: Int64 = 0x100000000
let var2: Int64 = 0
// warning: '-' is deprecated: Mixed-type subtraction is deprecated. Please use explicit type conversion.
if var1 - var2 > THRESHOLD {
print("foo")
} else {
print("bar")
}
在 32 位设备上,差异对于 Int
来说可能太大了
上面的例子会因运行时错误而中止
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0) frame #0: 0x0223d428 libswiftCore.dylib`protocol witness for Swift.Strideable.distance (to : A) -> A.Stride in conformance Swift.Int64 : Swift.Strideable in Swift + 72
解决方法是显式转换右侧:
if var1 - var2 > Int64(THRESHOLD) { ... }