Какова актуальность этого спецификатора формата String?

Я пытаюсь понять некоторый код, с которым я недавно столкнулся.

В ответе на вопрос здесь https://stackoverflow.com/a/51173170/1162328 автор использовал Строка со спецификатором формата при циклическом просмотре файлов в documentDirectory. Кто-нибудь может пролить свет на то, что на самом деле делает %@/%@?

for fileName in fileNames {
    let tempPath = String(format: "%@/%@", path, fileName)
    // Check for specific file which you don't want to delete. For me .sqlite files
    if !tempPath.contains(".sql") {
        try fileManager.removeItem(atPath: tempPath)
    } 
}

Чтение Архив документации Apple по основам форматирования Я наткнулся на это:

В строках формата символ «%» объявляет местозаполнитель для значения, а следующие за ним символы определяют тип ожидаемого значения и способ его форматирования. Например, строка формата «%d house» предполагает замену выражения формата «%d» целочисленным значением. NSString поддерживает символы формата, определенные для функции printf() ANSI C, плюс ‘@’ для любого объекта.

Что именно тогда делает %@/%@?


person Stamp    schedule 18.01.2020    source источник
comment
%@ в Swift — это то же самое, что и интерполяция. let tempPath = "\(path)/\(fileName)"   -  person Sulthan    schedule 18.01.2020
comment
Не используйте этот ответ. String(format: "%@/%@", path, fileName) это не то, как написал бы это любой разработчик Swift со средним опытом. Конкатенация строк (path + filename) или интерполяция ("\(path)/\(filename))) являются гораздо более разумными способами соединения строк. Но что более важно, вы не должны использовать строки для моделирования путей/URL-адресов, для чего предназначен URL, и у него уже есть замечательный appendingPathComponent API.   -  person Alexander    schedule 19.01.2020


Ответы (2)


%@ чем-то похож на %d или что-то в этом роде. Это способ интерполяции строк в Swift.

Чтобы быть точным, %@ - это заполнитель для объекта, который МНОГО используется в Objective-C. Поскольку NSString * был объектом (теперь это только строка), он использовался для вставки NSString * в другой NSString *.

Также данный код представляет собой просто переписанный код Objective-C, который был чем-то вроде

NSString *tempPath = [NSString stringWithFormat:@"%@/%@", path, filename];

который можно быстро переписать:

let tempPath = path + "/" + fileName

Кроме того, заданный путь = «Тест» и имя файла = «отлично» даст вывод «Тест/отлично».

Еще одно замечание: %@ так же хорош, как и опасен. Вы можете поместить в него UITableView, а также String. Он будет использовать свойство описания для вставки в строку.

person Miknash    schedule 18.01.2020

Каждый спецификатор формата заменяется одним из следующих аргументов (обычно в том же порядке, хотя это можно контролировать с помощью позиционных аргументов). Итак, в вашем случае первый %@ заменяется на path, а второй %@ заменяется на fileName. Пример:

let path = "/path/to/dir"
let fileName = "foo.txt"
let tempPath = String(format: "%@/%@", path, fileName)
print(tempPath) // /path/to/dir/foo.txt

Предпочтительный способ создания имен файлов и путей — использовать соответствующие методы URL вместо манипуляций со строками. Пример:

let pathURL = URL(fileURLWithPath: path)
let tempURL = pathURL.appendingPathComponent(fileName)
if tempURL.pathExtension != "sql" {
    try FileManager.default.removeItem(at: tempURL)
}
person Martin R    schedule 18.01.2020