Parameters 带字符串参数的Swift断言
为什么在斯威夫特这是合法的Parameters 带字符串参数的Swift断言,parameters,swift,assert,Parameters,Swift,Assert,为什么在斯威夫特这是合法的 assert( false, "Unexpected diagnosis: \(diagnosis)" ); 但这不是吗 let assertString = "Unexpected diagnosis: \(diagnosis)" assert( false, assertString ); 在第二个片段中,我得到了错误 无法使用类型为“(BooleanLiteralConverable,String)的参数列表调用“assert” 当然,第二个参数在这两种情况
assert( false, "Unexpected diagnosis: \(diagnosis)" );
但这不是吗
let assertString = "Unexpected diagnosis: \(diagnosis)"
assert( false, assertString );
在第二个片段中,我得到了错误
无法使用类型为“(BooleanLiteralConverable,String)的参数列表调用“assert”
当然,第二个参数在这两种情况下都是字符串。断言的第二个参数声明为
消息:@autoclosure()->Str
或\message:StaticString
。我猜“意外诊断:\(诊断)”
被视为表达式并由@autoclosure
拾取,而assertString
只是一个字符串
变量,无法转换为闭包或静态字符串
StaticString
只能通过以下方式创建:
static func convertFromExtendedGraphemeClusterLiteral(value: StaticString) -> StaticString
static func convertFromStringLiteral(value: StaticString) -> StaticString
我想这就解释了为什么swift手册中提到不能在
assert()
中使用字符串插值,因为不支持StringInterpolationConvertible
报价表文件:
…(assert()
)使用可选消息执行传统的C风格断言。
使用此功能进行内部健全性检查,这些检查在测试期间处于活动状态,但不会影响装运代码的性能。要检查发布版本中的无效用法,请参阅前提条件(\u:\ u:文件:行:)
我在Xcode 8上进行了测试,前置条件(::file:line:)
可以很好地处理格式化字符串。e、 g:
precondition(userId.lengthOfBytes(using: .ascii) > 0, "\(userId) is invalid for DBManager.id")
哇!谢谢,对于一个在Swift工作24小时以上的人来说,这是相当沉重的负担。我想这是多年来在“指针”世界工作的副作用,这对我来说并不明显。读了一些书,我现在明白了。谢谢