带插值的常量字符串

时间:2016-10-27 20:08:52

标签: swift

我有一个像这样插值的字符串

let userID = 123
let userProfileUrl = "website.com/user/\(userID)"

我想让website.com/user/\(userID)成为常量,但仍然保留其插值,以便我可以使用userID进行插值。

我想知道是否有人知道这样做的好方法

3 个答案:

答案 0 :(得分:1)

您可以使userProfileUrl成为一个惰性var。在这种情况下,您需要指定userProfileUrl的类型(即String),并且需要使用self.userID而不是userID

let userID = 123
lazy var userProfileUrl: String = "website.com/user/\(self.userID)"

或者,如果两个属性都是常量,并且不依赖于类的实例,则可以将它们放在类定义之外,它应该可以工作:

let userID = 123
let userProfileUrl = "website.com/user/\(userID)"

class MyClass {

}

您还可以将userProfileUrl设为计算属性

let userID = 123

var userProfileUrl: String {
    return "website.com/user/\(userID)"
}

如果您不喜欢计算属性添加的额外行,您可以对其进行格式化以使其全部在一行

let userID = 123
var userProfileUrl: String { return "website.com/user/\(userID)" }

答案 1 :(得分:0)

var userProfileURL: (String) -> String = {
    return "website.com/user/\($0)"
}

userProfileURL(userID)

这可以,但我会考虑使用枚举。您现在可以为每个端点创建一个新案例。

enum Website {

    case UserProfile(Int)

    var base: String { return "http://website.com" }
    var path: String {
        switch self {
        case let .UserProfile(userID):
            return "user/\(userID)"
        }
    }
    var url: URL { return URL(string: "\(base)/\(path)")! }
}

let userProfileUrl = Website.UserProfile(123).url

答案 2 :(得分:-3)

这可能是您希望NSStringString的桥接使用的地方-initWithFormat

let userProfileUrl = String(format: "website.com/user/%d", userId)