gpt4 book ai didi

ios - 在 Swift 字符串中操作标记

转载 作者:可可西里 更新时间:2023-11-01 01:58:36 24 4
gpt4 key购买 nike

我正在寻找在 Swift 中操作带有标记的字符串的最简单方法(在 C# 中我会使用 string.Format("{0}", "str")。例如:

let exampleString = "The word {0} is composed of {1} syllable."

我想要:

exampleString.setToken(index: 0, token: "frame") // 1
exampleString.setToken(index: 1, token: "two")
print(
exampleString.asArray() // 2
== ["The world ", "frame", " is composed of ", "two", " syllable."]
) // Prints "true"

// Final use case :
exampleString.asArray().forEach {
if $0.isToken { // 3
doSomething($0)
} else {
doSomethingElse($0)
}
}

如何以简单的方式管理字符串、标记索引和值(1、2 和 3)? Foundation API 是否提供任何方法来处理这个问题,还是我必须通过自定义模型和扩展?

最佳答案

虽然我不完全理解为什么这样的东西在现实世界中真的很有用,但我想出了一些想法:

您可以创建一个自定义类来处理这些事情。对于我的示例,我只是将其命名为 CustomString,这是一个糟糕的名称。

class CustomString {

internal var text: String
private var tokens: [Int : String]

internal var components: [String] {
get {
return self.text.components(separatedBy: " ")
}
}

init(text: String) {
self.text = text
self.tokens = [Int : String]()
}

func setToken(_ token: String, atIndex index: Int) {
self.tokens[index] = token
}

func token(forIndex index: String) -> String? {
let converted = Int(index.replacingOccurrences(of: "{", with: "").replacingOccurrences(of: "}", with: ""))
guard let validInt = converted else { return nil }
return self.tokens[validInt]
}

func fullString() -> String {
var fullString = self.text
self.tokens.forEach({ fullString = fullString.replacingOccurrences(of: "{\($0.key)}", with: $0.value) })
return fullString
}

func asArray() -> [String] {
return self.fullString().components(separatedBy: " ")
}

}

此外,我向 String 扩展添加了一个计算属性来处理 isToken 请求。这也可以作为 CustomString 上的一个函数来实现,但是需要将一个字符串传递给该函数,这看起来不太好。

extension String {

var isToken: Bool {
get {
guard self.components(separatedBy: " ").count == 1 else { return false }
return self.first == "{" && self.last == "}"
}
}

}

对于用法,它应该是这样的:

let exampleString = "The word {0} is composed of {1} syllable."
let customVersion = CustomString(text: exampleString)
customVersion.setToken("string", atIndex: 0)
customVersion.setToken("one", atIndex: 1)

customVersion.fullString() //"The word string is composed of one syllable."
customVersion.asArray() //["The", "word", "string", "is", "composed", "of", "one", "syllable."]

customVersion.components.forEach({
if $0.isToken {
print("\(customVersion.token(forIndex: $0)) is a token")
}
})
//Prints: string is a token --- one is a token

我个人会避免在生产代码中做这样的事情,因为有大量的错误和意外行为的可能性。最容易指出的是这个例子:

let exampleString = "What word goes here: {0}?"
exampleString.setToken("Nothing", atIndex: 1)

这个例子也说明了我的主要观点,即这是否真的是一项有用的任务。如果你有一个带有已知数量标记的静态句子,并且你必须在代码中设置每个标记,为什么不只使用单个变量或数组/字典来保存所有“标记”并在你的句子中使用字符串插值?这也将使所有其他“功能”变得更容易,因为您不必检查完整的句子来找到标记 - 您已经将它们放在自己的位置,并且可以用它们做任何想做的事。

如果这样做的论据是你从一些外部来源获取句子的片段,比如 API 或其他东西,它似乎甚至更多对我来说没有必要,因为你的 API 可以提供无论如何,你组装的句子。

无论哪种方式,这段代码都经过测试并在正常条件下工作——如果没有为每个索引设置一个标记,或者如果任何标记包含 { 或 } 字符,句子没有被分隔,它将失败空格等。作为一个基本的起点,这是可行的。

关于ios - 在 Swift 字符串中操作标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48625552/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com