Swift使用字符串参数断言

时间:2014-10-01 09:10:02

标签: parameters swift assert

为什么Swift是合法的......

assert( false, "Unexpected diagnosis: \(diagnosis)" );

而这不是?

let assertString = "Unexpected diagnosis: \(diagnosis)"
assert( false, assertString );

在第二个片段中,我收到了错误...

  

无法调用'断言'使用类型'(BooleanLiteralConvertible,String)的参数列表

当然,第二个参数在两种情况下都是一个字符串。

2 个答案:

答案 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")