Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.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
swift中的类型安全字符串插值_Swift - Fatal编程技术网

swift中的类型安全字符串插值

swift中的类型安全字符串插值,swift,Swift,我的代码看起来像: var link = "http://example.com/images/\(myFoo)_pattern.html" myCustomObject.link = link 问题是我遇到了一个奇怪的错误,这个链接是从多个地方设置的-有时myFoo是一个可选的。/Optional('realValue')\u pattern.html而不是realValue\u pattern.html 基本上涉及到插值,在我的例子中字符串“不正确地展开”。我知道解决方法(确保不在这些地方

我的代码看起来像:

var link = "http://example.com/images/\(myFoo)_pattern.html"
myCustomObject.link = link
问题是我遇到了一个奇怪的错误,这个链接是从多个地方设置的-有时
myFoo
是一个
可选的
。/Optional('realValue')\u pattern.html
而不是
realValue\u pattern.html

基本上涉及到插值,在我的例子中字符串“不正确地展开”。我知道解决方法(确保不在这些地方传递optionals),但当我错误地传递这些值时,我没有类型错误或编译器警告

基本上,我想要一个类型安全的替代方案,以防止这些PBKAC错误再次发生。最理想的情况是,我想知道是否有一种执行字符串插值的方法不会导致这些意外结果,但仍然易于使用


有更好的方法吗?

如果我理解正确,您希望有一种方法可以从变量的字符串插值中消除
Optional()
,而不提前知道它们是否是可选的。一种方法是定义后缀运算符
&
,您可以将它放在以您想要的方式执行字符串插值的所有变量之后

以下是问题的一个示例:

var str1: String = "bye"
var str2: String! = "hello"
var str3: String? = "aloha"

println("\(str1) \(str2) \(str3)")  // prints "bye hello Optional("aloha")"
为所有类型定义后缀运算符
&

postfix operator & {}

postfix func & <T>(s: T?) -> String {
    return (s == nil) ? "nil" : "\(s!)"
}

postfix func & <T>(s: T) -> String {
    return "\(s)"
}

然后,如果您记得使用
&
,您就不必担心它们是什么类型的值,而且如果您将来将它们更改为可选类型,它们仍然可以工作。

假设myFoo是可选的,您只需执行以下操作:

var link = "http://example.com/images/\(myFoo!)_pattern.html" // note '!'
myCustomObject.link = link

“那么,如果你能记住使用&”-有没有办法得到相反的结果?也就是说,不能忘记使用特定语法,因为这样做会导致编译错误?我可以使用
现在。(很好地使用了规则解析btw)
优于
is您不需要知道
myFoo
是否是可选的。我想不出任何方法可以通过编译错误来实现这一点。也许有一种方法可以改变选项的字符串插值,但我不知道怎么做。我认为swift编译器不允许这种情况发生,即myFoo是可选的,或者不是同时出现的。你是如何声明myFoo的?这是为什么?这是Swift的创作者做出的一个糟糕的设计选择,让它成为价值描述的一部分。
var link = "http://example.com/images/\(myFoo!)_pattern.html" // note '!'
myCustomObject.link = link