Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parameters 带字符串参数的Swift断言_Parameters_Swift_Assert - Fatal编程技术网

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小时以上的人来说,这是相当沉重的负担。我想这是多年来在“指针”世界工作的副作用,这对我来说并不明显。读了一些书,我现在明白了。谢谢