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

oya*_*lhi 9 formatting swift

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

为什么是这样?是因为它被定义为静态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)  
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

rma*_*ddy 15

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

  • 实际上,`%@` 是用于对象的,而不仅仅是文本。您可以在文档中找到有关所有格式说明符的详细信息。查看“NSString stringWithFormat:”的文档以获取链接。 (2认同)
  • 实际上,这里是链接:https://developer.apple.com/library/prerelease/content/documentation/CoreFoundation/Conceptual/CFStrings/formatSpecifiers.html#//apple_ref/doc/uid/TP40004265 (2认同)

Sah*_*hil 14

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

格式说明符:

%d - int Value 
%f - float value
%ld - long value
%@ - string value and for many more.
Run Code Online (Sandbox Code Playgroud)

有关所有格式说明符,请参阅Apple Doc 格式说明符


Mic*_*sen 7

你可以使用这个扩展

斯威夫特 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)
    }

}
Run Code Online (Sandbox Code Playgroud)

使用:

let txt = "My name is %@, I am %@ years old".format("Mickael", 24)
Run Code Online (Sandbox Code Playgroud)