Расширяя ответ @ mcfedr, этот Swift 3 помощник выполняет свою работу:
import Foundation
@objc (FTStringFormat) public class StringFormat: NSObject {
@objc public class func format(key: String, args: [AnyObject]) -> String {
let locArgs: [CVarArg] = args.flatMap({ (arg: AnyObject) -> CVarArg? in
if let arg = arg as? NSNumber {
return arg.intValue
}
if let arg = arg as? CustomStringConvertible {
return arg.description
}
return nil
});
return String(format: key, arguments: locArgs)
}
}
Вызов из Objective-C:
[FTStringFormat formatWithKey:@"name: %@ age: %d" args:@[@"John", @(42)]]
Для спецификатора формата %@
мы используем протокол CustomStringConvertible
Swift для вызова description
на всех членах массива.
Поддержка всех спецификаторов числового формата, таких как %d
и %f
, на самом деле невозможна, поскольку объект NSNumber
не показывает, является ли он целым числом или числом с плавающей точкой. Таким образом, мы могли поддержать только одного или другого. Здесь мы используем intValue
, поэтому %d
поддерживается, но %f
и %g
- нет.