我有以下带有字符串私有结构的类,我希望稍后将它们用于格式化字符串。但是,代码在运行时崩溃。
这是为什么?是因为它被定义为静态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)
}
}
}
答案 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
。您需要将%d
与Int
一起使用。
答案 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)