我想将字符串中包含的字母的索引转换为整数值。试图读取头文件,但我找不到Index
的类型,尽管它似乎符合ForwardIndexType
协议的方法(例如distanceTo
)。
var letters = "abcdefg"
let index = letters.characters.indexOf("c")!
// ERROR: Cannot invoke initializer for type 'Int' with an argument list of type '(String.CharacterView.Index)'
let intValue = Int(index) // I want the integer value of the index (e.g. 2)
任何帮助都很感激。
9条答案
按热度按时间lzfw57am1#
编辑/更新:
Xcode 11 · Swift 5.1以上
Playground测试
uxhixvfz2#
适用于Xcode 13和Swift 5
函数
func distance(from start: String.Index, to end: String.Index) -> String.IndexDistance
返回IndexDistance
,它只是Int
的typealias
hzbexzde3#
Swift 4酒店
注意:如果String包含相同的多个字符,则只取左数最近的一个
w6lpcovy4#
Swift 4.2弃用
encodedOffset
。弃用消息:
encodedOffset
已被弃用,因为大多数常见用法都不正确。使用utf16Offset(in:)
实现相同的行为。我们可以这样使用
utf16Offset(in:)
:x6492ojm5#
当搜索像这样的索引时
它被视为Array.Index。你必须给予编译器一个提示,你想要一个整数
7kqas0il6#
*Swift 5酒店
你可以先转换成字符数组,然后使用
advanced(by:)
转换成整数。t5zmwmid7#
基于索引的字符串运算,不能用传统的索引数值方法来实现。因为swift.index是由indices函数检索的,并且它不是Int类型。即使String是一个字符数组,我们仍然不能通过索引读取元素。
真让人沮丧
因此,要为字符串的每个偶数字符创建新的子字符串,请检查下面的代码。
输出:acegikmoqsuwy
先谢了
l7wslrjt8#
Here is an extension,它允许你访问子字符串的边界为
Int
s,而不是String.Index
值:只是要知道,这可能会导致怪异,这就是为什么苹果选择让它变得困难。(虽然这是一个有争议的设计决策-通过使其变得困难来隐藏危险的事情......)
您可以在String documentation from Apple中阅读更多内容,但tldr是因为这些“索引”实际上是特定于实现的。它们表示字符串在被操作系统渲染后的索引,因此可以根据所使用的Unicode规范的版本从操作系统转移到操作系统。这意味着通过索引访问值不再是一个常数时间操作,因为UTF规范必须在数据上运行以确定字符串中的正确位置。这些索引也不会与NSString生成的值对齐(如果您桥接到它),或者与底层UTF标量的索引对齐。开发人员注意事项。
flmtquvp9#
如果你得到了一个“索引超出界限”的错误。你可以试试这个方法。使用Swift 5