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