为什么Swift是合法的......
assert( false, "Unexpected diagnosis: \(diagnosis)" );
而这不是?
let assertString = "Unexpected diagnosis: \(diagnosis)"
assert( false, assertString );
在第二个片段中,我收到了错误...
无法调用'断言'使用类型'(BooleanLiteralConvertible,String)的参数列表
当然,第二个参数在两种情况下都是一个字符串。
答案 0 :(得分:4)
断言的第二个参数被声明为message: @autoclosure () -> Str
或_ message: StaticString
。我猜"Unexpected diagnosis: \(diagnosis)"
被视为表达式并被@autoclosure
选中,而assertString
只是一个String
变量,无法转换为闭包或StaticString
。< / p>
StaticString
只能用:
static func convertFromExtendedGraphemeClusterLiteral(value: StaticString) -> StaticString
static func convertFromStringLiteral(value: StaticString) -> StaticString
我想这解释了为什么swift手册注意到你不能在assert()
中使用字符串插值,因为不支持StringInterpolationConvertible
。
答案 1 :(得分:0)
引用表格文件:
...(
assert()
)使用可选消息执行传统的C样式断言。 使用此功能进行内部健全性检查,这些检查在测试期间处于活动状态,但不会影响运输代码的性能。要检查版本构建中的无效用法,请参阅precondition(_:_:file:line:)
。
我测试了Xcode 8,precondition(_:_:file:line:)
可以正常使用格式化字符串。 e.g:
precondition(userId.lengthOfBytes(using: .ascii) > 0, "\(userId) is invalid for DBManager.id")