问答详情
源自:4-4 Swift-String.Index和Range

有没有办法把String.Index的数值转成Int呢?

比如我想通过一个字符在字符串中的位置,查找一个数组中的相应元素?

eg:通过“123456”中“3”的位置查找[1,2,3,4,5,6]中的3

提问者:JoeMartini 2014-11-04 01:14

个回答

  • TickTock
    2015-03-04 11:34:24

    这个问题已经过去半年了吧,你应该已经解决了,习惯性的看一下问答区,巩固这节课学到的东西,试着答一下。

    ===================================

    源码中String有这么一句

    extension String : CollectionType {

    它实现了CollectionType这个接口

    这个接口是这样的

    protocol CollectionType : _CollectionType, SequenceType {

    然后看_CollectionType可以知道,Index其实是ForwardIndexType的一个别名,它和String里面的叫Index的struct是不一样的,那个是startIndex

    这么复杂的原因是因为每个字符的长度是不一样的,比如视频里的\u{1F496}就和普通的字符"3"不一样长

    所以不能简单的通过index去取字符,也就不可能返回一个Int类型的index,因为这个index代表的位置,和通常概念的index是不一样的,它是字符在字符串中的真实位置,不是序号,你想要的其实是个序号,这个序号我没找到怎么直接拿,但是用for循环是可以取到的,数组里就可以用下标了


    PS.

    然后看到这里,我就不太明白了,怎么才能一个个的去取字符串里的字符呢?

    找了点资料后,发现可以这么实现

    var str = "\u{1F496}3\u{1F496}3\u{1F496}3\u{1F496}3\u{1F496}"

    var step = advance(str.startIndex, 1)

    var index = step..<step.successor()

    var substring: String = str[index]

    这样通过step中的0,1,2,3就可以一个字符串中任意长度的字符了

    先通过advance找到第一个字符,然后定义一个range,第一个字符..<下一个字符

    再通过这个index就可以拿出对应的字符了。

    如果要从开头开始截取到某个位置,可以改成这样

    var step = advance(str.startIndex, 2)

    var index = str.startIndex..<step

    var substring: String = str[index]