在Swift中使用%@格式化字符串

时间:2016-11-16 07:07:54

标签: swift formatting

我有以下带有字符串私有结构的类,我希望稍后将它们用于格式化字符串。但是,代码在运行时崩溃。

这是为什么?是因为它被定义为静态let?

以下是剥离的代码:

class LGNotificationHandler {
    private struct Strings {
        static let SentImagesENG = "Sent %@ images to the event"
        static let SentImagesTUR = "Etkinliğe %@ görsel gönderdi"
    }

    func buildNotificationString(imageCount: Int) -> String {
        if imageCount == 1 {
        .
        .
        .

        } else {
            // below line is giving error at run time
            notificationENG = String(format: Strings.SentImagesENG, imageCount)  
            notificationTUR = String(format: Strings.SentImagesTUR, imageCount)  
        }
    }
}

3 个答案:

答案 0 :(得分:11)

您需要将%@ 替换为%d 。 ImageCount是Int值。所以使用%d 而不是%@

格式说明符:

%d - int Value 
%f - float value
%ld - long value
%@ - string value and for many more.

有关所有格式说明符的信息,请参阅Apple Doc Format Specifiers

答案 1 :(得分:11)

您忽略了提供有关崩溃的任何详细信息,但一个明显的问题是使用%@格式说明符和Int。您需要将%dInt一起使用。

答案 2 :(得分:3)

您可以使用此扩展名

快速5

extension String {

    func format(_ arguments: CVarArg...) -> String {
        let args = arguments.map {
            if let arg = $0 as? Int { return String(arg) }
            if let arg = $0 as? Float { return String(arg) }
            if let arg = $0 as? Double { return String(arg) }
            if let arg = $0 as? Int64 { return String(arg) }
            if let arg = $0 as? String { return String(arg) }
            if let arg = $0 as? Character { return String(arg) }

            return "(null)"
        } as [CVarArg]

        return String.init(format: self, arguments: args)
    }

}

使用:

let txt = "My name is %@, i have %@ years old".format("Mickael", 24)