在Swift中如何创建字符串模板?

12

我希望在Swift中将一个字符串作为常量存储,以便重复使用并注入变量。例如,我可以在C#中这样做:

var template = "Your name is {0} and your age is {1}."
someLabel.text = string.Format(template, "John", 35)
some2Label.text = string.Format(template, "Jane", 33)

我该如何在Swift中完成这个操作,以便我可以重复使用字符串模板?


1
Swift可以调用Objective-C Cocoa方法,因此可以查看NSString的stringWithFormat:方法 - 在Swift中它与在Objective-C中一样有效。 - matt
谢天谢地我跳过了 Objective-C,所以不知道。 - TruMan1
3
但这不是重点。重点是文档还是文档。阅读NSString的文档,一切都在那里。 - matt
3个回答

40

使用Swift的printf风格的语法保存模板,然后像这样使用:

var template = "Your name is %@ and your age is %d."
someLabel.text = String(format: template, "John", 35)
some2Label.text = String(format: template, "Jane", 33)
如果您之前没有使用过这种语法风格,这里有一个简单的指南:
  • %@ : 字符串(或者像 nhgrif 指出的那样,是NSObjectdescription/descriptionWithLocale属性)
  • %d : 整型
  • %f : 双精度浮点型
  • %.2f : 保留两位小数的双精度浮点型,例如 2.2342 -> 2.23

如果需要更多精度,这里有文档提供。


3
%@ 不仅适用于 String - nhgrif
2
好的答案(已投票)。我想知道是否也可以将Swift风格的格式字符串作为参数使用?let aString =“John has \(count)jellybeans”;let newString = String(format:aString,count) - Duncan C

7

您已经有了一个答案,但如果您想要类型安全并本地化您的代码,您可以使用枚举类型,如下所示:

enum Greeting: CustomStringConvertible {

    case SayHello(String)

    var description:String {
        switch (self) {
        case .SayHello(let name):
            return "Say hello to \(name)?"
        }
    }
}

let a = Greeting.SayHello("my little friend")

请注意,这并不排除您采用混合方法,将所有字符串模板放在一个位置,并通过String(format:...)方法在类型安全的枚举中构建它们。 您只需要仔细实现它(但只需实现一次)。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接