如何获取字符串的第 n 个字符?我尝试了括号([])访问器,但没有成功。
[]
var string = "Hello, world!" var firstChar = string[0] // Throws error
错误:“下标”不可用:无法使用 Int 为字符串下标,请参阅文档注释以进行讨论
注意: 有关 Swift 4 和 Swift 5 的正确实现,请参阅:
您可以扩展 StringProtocol 以使下标也可用于子字符串:
extension StringProtocol { subscript(_ offset: Int) -> Element { self[index(startIndex, offsetBy: offset)] } subscript(_ range: Range<Int>) -> SubSequence { prefix(range.lowerBound+range.count).suffix(range.count) } subscript(_ range: ClosedRange<Int>) -> SubSequence { prefix(range.lowerBound+range.count).suffix(range.count) } subscript(_ range: PartialRangeThrough<Int>) -> SubSequence { prefix(range.upperBound.advanced(by: 1)) } subscript(_ range: PartialRangeUpTo<Int>) -> SubSequence { prefix(range.upperBound) } subscript(_ range: PartialRangeFrom<Int>) -> SubSequence { suffix(Swift.max(0, count-range.lowerBound)) } }
extension LosslessStringConvertible { var string: String { .init(self) } }
extension BidirectionalCollection { subscript(safe offset: Int) -> Element? { guard !isEmpty, let i = index(startIndex, offsetBy: offset, limitedBy: index(before: endIndex)) else { return nil } return self[i] } }
测试
let test = "Hello USA 🇺🇸!!! Hello Brazil 🇧🇷!!!" test[safe: 10] // "🇺🇸" test[11] // "!" test[10...] // "🇺🇸!!! Hello Brazil 🇧🇷!!!" test[10..<12] // "🇺🇸!" test[10...12] // "🇺🇸!!" test[...10] // "Hello USA 🇺🇸" test[..<10] // "Hello USA " test.first // "H" test.last // "!" // Subscripting the Substring test[...][...3] // "Hell" // Note that they all return a Substring of the original String. // To create a new String from a substring test[10...].string // "🇺🇸!!! Hello Brazil 🇧🇷!!!"
该Substring类型是在 Swift 4 中引入的,通过与原始字符串共享存储来使子字符串更快、更高效,所以这就是下标函数应该返回的内容。
Substring
在这里试试
extension StringProtocol { subscript(offset: Int) -> Character { self[index(startIndex, offsetBy: offset)] } subscript(range: Range<Int>) -> SubSequence { let startIndex = index(self.startIndex, offsetBy: range.lowerBound) return self[startIndex..<index(startIndex, offsetBy: range.count)] } subscript(range: ClosedRange<Int>) -> SubSequence { let startIndex = index(self.startIndex, offsetBy: range.lowerBound) return self[startIndex..<index(startIndex, offsetBy: range.count)] } subscript(range: PartialRangeFrom<Int>) -> SubSequence { self[index(startIndex, offsetBy: range.lowerBound)...] } subscript(range: PartialRangeThrough<Int>) -> SubSequence { self[...index(startIndex, offsetBy: range.upperBound)] } subscript(range: PartialRangeUpTo<Int>) -> SubSequence { self[..<index(startIndex, offsetBy: range.upperBound)] } }
要将 the 转换Substring为 a String,您可以简单地执行String(string[0..2]),但仅当您打算保留子字符串时才应该这样做。否则,保留它会更有效Substring。
String
String(string[0..2])
如果有人能想出一种将这两个扩展合并为一个的好方法,那就太好了。 我尝试扩展StringProtocol 但没有成功,因为index那里不存在该方法。注意:此答案已经过编辑,已正确实施,现在也适用于子字符串。只需确保使用有效范围以避免在为您的 StringProtocol 类型下标时崩溃。对于不会因超出范围值而崩溃的范围的下标,您可以使用此实现
StringProtocol
index
错误消息显示 “请参阅文档评论进行讨论” 。Apple 在文件UnavailableStringAPIs.swift中提供了以下解释:
无法使用整数下标字符串。 i“字符串中的第一个字符”的概念在不同的库和系统组件中有不同的解释。正确的解释应该根据用例和所涉及的API来选择,所以String 不能用整数下标。 Swift 提供了几种不同的方式来访问存储在字符串中的字符数据。 String.utf8是字符串中 UTF-8 代码单元的集合。将字符串转换为 UTF-8 时使用此 API。大多数 POSIX API 根据 UTF-8 代码单元处理字符串。 String.utf16是字符串中 UTF-16 代码单元的集合。大多数 Cocoa 和 Cocoa touch API 以 UTF-16 代码单元处理字符串。例如, NSRange使用NSAttributedString和 NSRegularExpression存储子字符串偏移量和长度的实例以 UTF-16 代码单元表示。 String.unicodeScalars是 Unicode 标量的集合。当您对字符数据执行低级操作时,请使用此 API。 String.characters是扩展字素簇的集合,是用户感知字符的近似值。 请注意,在处理包含人类可读文本的字符串时,应尽可能避免逐字符处理。请改用高级语言环境敏感的 Unicode 算法,例如 String.localizedStandardCompare(), String.localizedLowercaseString等 String.localizedStandardRangeOfString()。
无法使用整数下标字符串。
i“字符串中的第一个字符”的概念在不同的库和系统组件中有不同的解释。正确的解释应该根据用例和所涉及的API来选择,所以String 不能用整数下标。
i
Swift 提供了几种不同的方式来访问存储在字符串中的字符数据。
String.utf8是字符串中 UTF-8 代码单元的集合。将字符串转换为 UTF-8 时使用此 API。大多数 POSIX API 根据 UTF-8 代码单元处理字符串。
String.utf8
String.utf16是字符串中 UTF-16 代码单元的集合。大多数 Cocoa 和 Cocoa touch API 以 UTF-16 代码单元处理字符串。例如, NSRange使用NSAttributedString和 NSRegularExpression存储子字符串偏移量和长度的实例以 UTF-16 代码单元表示。
String.utf16
NSRange
NSAttributedString
NSRegularExpression
String.unicodeScalars是 Unicode 标量的集合。当您对字符数据执行低级操作时,请使用此 API。
String.unicodeScalars
String.characters是扩展字素簇的集合,是用户感知字符的近似值。
String.characters
请注意,在处理包含人类可读文本的字符串时,应尽可能避免逐字符处理。请改用高级语言环境敏感的 Unicode 算法,例如 String.localizedStandardCompare(), String.localizedLowercaseString等 String.localizedStandardRangeOfString()。
String.localizedStandardCompare()
String.localizedLowercaseString
String.localizedStandardRangeOfString()