我无法弄清楚如何从文件加载字符串,并且插入该字符串中引用的变量。
让我们说filePath
的文本文件包含以下内容:
Hello there, \(name)!
我可以将此文件加载到包含以下内容的字符串中:
let string = String.stringWithContentsOfFile(filePath, encoding: NSUTF8StringEncoding, error: nil)!
在我的班级中,我在let name = "George"
我希望这个新字符串使用我的常量插入\(name)
,以使其值为Hello there, George!
。 (实际上,文本文件是一个更大的模板,需要交换许多字符串。)
我看到String
有convertFromStringInterpolation
方法,但我无法弄清楚这是否是正确的方法。有没有人有任何想法?
答案 0 :(得分:0)
没有内置的机制来执行此操作,您必须创建自己的。
以下是一个非常基本版本的示例:
var values = [
"name": "George"
]
var textFromFile = "Hello there, <name>!"
var parts = split(textFromFile, {$0 == "<" || $0 == ">"}, maxSplit: 10, allowEmptySlices: true)
var output = ""
for index in 0 ..< parts.count {
if index % 2 == 0 {
// If it is even, it is not a variable
output += parts[index]
}
else {
// If it is odd, it is a variable so look it up
if let value = values[parts[index]] {
output += value
}
else {
output += "NOT_FOUND"
}
}
}
println(output) // "Hello there, George!"
根据您的使用情况,您可能需要更加强大。
答案 1 :(得分:0)
这不能按照您的意图完成,因为它在编译时违反了类型安全性(编译器无法检查您尝试在字符串文件中引用的变量的类型安全性)。
作为解决方法,您可以手动定义替换表,如下所示:
// Extend String to conform to the Printable protocol
extension String: Printable
{
public var description: String { return self }
}
var string = "Hello there, [firstName] [lastName]. You are [height]cm tall and [age] years old!"
let firstName = "John"
let lastName = "Appleseed"
let age = 33
let height = 1.74
let tokenTable: [String: Printable] = [
"[firstName]": firstName,
"[lastName]": lastName,
"[age]": age,
"[height]": height]
for (token, value) in tokenTable
{
string = string.stringByReplacingOccurrencesOfString(token, withString: value.description)
}
println(string)
// Prints: "Hello there, John Appleseed. You are 1.74cm tall and 33 years old!"
您可以将任何类型的实体存储为tokenTable
的值,只要它们符合Printable
协议。
要进一步自动化,您可以在单独的Swift文件中定义tokenTable
常量,并使用单独的脚本从包含字符串的文件中提取标记来自动生成该文件。
请注意,对于非常大的字符串文件,这种方法可能效率很低(但是比首先将整个字符串读入内存的效率要低得多)。如果这是一个问题,请考虑以缓冲方式处理字符串文件。