为什么在Swift中这是合法的...

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

而这不是吗?
let assertString = "Unexpected diagnosis: \(diagnosis)"
assert( false, assertString );

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



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

最佳答案

assert的第二个参数声明为message: @autoclosure () -> Str_ message: StaticString。我猜"Unexpected diagnosis: \(diagnosis)"被视为表达式并由@autoclosure接受,而assertString只是一个String变量,无法转换为闭包或StaticString
StaticString只能通过以下方式制作:

static func convertFromExtendedGraphemeClusterLiteral(value: StaticString) -> StaticString
static func convertFromStringLiteral(value: StaticString) -> StaticString

我猜这解释了为什么swift手册会指出您不能在assert()中使用字符串插值,因为不支持StringInterpolationConvertible

10-08 18:30