有时候操作String在Swift中可能有点麻烦,这里有些技巧,可能会对您的开发有所帮助。
Split
将字符串拆分为数组。
let text = "ab.c1,23"
print(text.components(separatedBy: [".", ","]))
// ["ab", "c1", "23"]
将数组转化为字符串。
print(["ab", "c1", "23"].reduce("", { $0 + $1}))
// abc123
Sort string
首先,我们将拆分字符串,然后排序,然后再连接在一起。 在这个例子中,我将数组<Character>映射到数组<String>,所以它可以更容易排序。 这可能是没有必要的,但我还没有找到一个更好的方法,如果您知道,希望你能告诉我。
let text = "ab.c1,23"
print(text.characters.sorted { $0 < $1 }.flatMap({ String($0) }).joined())
// ,.123abc
Trim whitespace
从字符串中删除所有前导和尾随空格。
extension String {
func trimmed(set: CharacterSet = .whitespaces) -> String {
return trimmingCharacters(in: set)
}
}
let text = " ab23 "
print(text.trimmed())
// "ab23"
其中还有很多其他字符集包括:
alphanumericCharacterSet
whitespaceCharacterSet
symbolCharacterSet
punctuationCharacterSet
此外,您可以通过添加.inverted到最后来获得任何字符集的反集。
删除String中的所有空格
let text = " a b 2 3 "
print(text.replacingOccurrences(of: " ", with: ""))
// "ab23"
Substring
访问字符串中的字符显得有点冗长。 它有助于将Swift中的String视为不是字符数组,而是作为Unicode标量,可以使用String.unicodeScalars访问。 String.Index跟踪字符索引。
当然,可以扩展String以允许使用Integer下标。 请记住,在某些情况下,这可能会添加歧义。 Swift希望我们是明确的获取字符串中的子串:
extension String {
func substring(to string: String) -> String {
return substring(to: (range(of: string)?.lowerBound) ?? endIndex)
}
subscript (i: Int) -> String {
return String(self[self.index(self.startIndex, offsetBy: i)])
}
subscript (r: Range<Int>) -> String {
let start = self.index(self.startIndex, offsetBy: r.lowerBound)
let end = self.index(self.startIndex, offsetBy: r.upperBound)
return self[start...end]
}
}
var text = "1234<user>"
print(text.substring(to: "<")) // "1234"
print(text[2]) // 3
suffix/prefix
let line = "0001 Some test data here %%%%"
line.hasPrefix("0001") // true
line.hasSuffix("%%%%") // true
转换为大小写
顾名思义:
let mixedCase = "AbcDef"
let upper = mixedCase.uppercased()
// "ABCDEF"
let lower = mixedCase.lowercased()
// "abcdef"
Counting
String不直接具有返回计数的属性,因为它只对特定表示有意义。 所以count在每个集合上实现:
var emptyString = ""
emptyString.isEmpty // true
let spain = España
print("\(spain.characters.count)") // 6
print("\(spain.unicodeScalars.count)") // 6
print("\(spain.utf16.count)") // 6
print("\(spain.utf8.count)") // 7
比较排序:
if "aaa" < "bbb" {
print("aaa is less than bbb") // "aaa is less than bbb"
}