这个 String 格式说明符的相关性是什么?

What is the relevance of this String format specifier?

我正在尝试了解我最近遇到的一些代码。

在此处 问题的回答中,作者在循环访问 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 documentation archive for Formatting Basics 我遇到了这个:

In format strings, a ‘%’ character announces a placeholder for a value, with the characters that follow determining the kind of value expected and how to format it. For example, a format string of "%d houses" expects an integer value to be substituted for the format expression '%d'. NSString supports the format characters defined for the ANSI C functionprintf(), plus ‘@’ for any object.

那么 %@/%@ 到底在做什么?

%@ 类似于 %d 或类似的东西。这是Swift.

中字符串插值的方式

确切地说,%@ 是对象的占位符 - 在 Objective-C 中大量使用。由于 NSString * 是对象(现在它只是字符串),它被用来将 NSString * 插入另一个 NSString *

还给定的代码刚刚被重写 objective-c 类似

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

可以改写成swift:

let tempPath = path + "/" + fileName

此外,给定路径 = "Test" 和文件名 = "great" 将给出输出 Test/great.

请注意:%@ 既好又危险。您可以将 UITableView 和 String 放入其中。它将使用描述 属性 插入字符串。

每个格式说明符都被以下参数之一替换(通常顺序相同,尽管可以用位置参数控制)。因此,在您的情况下,第一个 %@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)
}