Какова актуальность этого спецификатора формата String? - PullRequest
2 голосов
/ 18 января 2020

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

В ответе на вопрос здесь { ссылка } автор использовал строку с спецификатор формата при зацикливании файлов в 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 Houses» ожидает, что вместо выражения формата «% d» будет подставлено целочисленное значение. NSString поддерживает символы формата, определенные для ANSI C functionprintf (), плюс '@' для любого объекта.

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

Ответы [ 2 ]

4 голосов
/ 18 января 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)
}
2 голосов
/ 18 января 2020

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

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

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

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

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

let tempPath = path + "/" + fileName

Также, учитывая path = "Test" и fileName = "great" приведут к выводу Test / great.

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

...