在swift中键入安全字符串插值

时间:2014-09-28 09:02:01

标签: swift

我的代码类似于:

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

问题是我遇到了一个奇怪的错误,这个链接是从多个地方设置的 - 有时myFooOptional所以我最终得到的是../Optional('realValue')_pattern.html而不是realValue_pattern.html }。

基本上涉及插值,在我的情况下字符串“不正确地展开”。我知道解决方法(以确保不在这些位置传递选项)但是当我错误地传递这些值时,我没有类型错误或编译器警告。

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

有没有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:2)

如果我理解正确,你想要一种方法从变量的字符串插值中消除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)"
}

当您进行字符串插值时,请使用&关注您的变量:

println("\(str1&) \(str2&) \(str3&)")  // prints "bye hello aloha"

然后,如果你能记住使用&,你就不必担心它们是什么类型的值,如果将来将它们更改为可选类型它们仍然有用。

答案 1 :(得分:-2)

假设myFoo是可选的,您只需要这样做:

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