Ios 类型';String.Index';不符合协议';积分式可转换&x27;

Ios 类型';String.Index';不符合协议';积分式可转换&x27;,ios,xcode,swift,Ios,Xcode,Swift,Beta 3运行良好,现在我遇到了一个奇怪的错误,我不知道如何修复它。尝试了所有类似问题的解决方案 这是我的密码: if !name.isEmpty { var splitted: [String] = name.componentsSeparatedByString(" ") for curPart in splitted { if !curPart.isEmpty { acronym += curPar

Beta 3运行良好,现在我遇到了一个奇怪的错误,我不知道如何修复它。尝试了所有类似问题的解决方案

这是我的密码:

if !name.isEmpty {
        var splitted: [String] = name.componentsSeparatedByString(" ")

        for curPart in splitted {
            if !curPart.isEmpty {
                acronym += curPart.substringToIndex(1) //Error
            }
        }
        if (acronym as NSString).length > 2 {
            acronym = acronym.substringToIndex(2) //Error
        }
    }
两个标记行都给了我相同的错误:

类型“String.Index”不符合协议“IntegerLiteralConverable”

有人能帮我吗?还是Beta 4被窃听了?
谢谢

Swift对字符串组件和迭代的概念在Beta 4中发生了变化。从中,我们看到:

Swift字符类型的每个实例都表示一个扩展的grapheme集群。扩展的grapheme集群是一个或多个Unicode标量的序列,它们(在组合时)生成单个人类可读字符

这有一些有趣的副作用:

let str1 = "abc"
let str2 = "\u{20DD}def"

countElements(str1)      // 3 
countElements(str2)      // 4
countElements(str1+str2) // 6 ≠ 3+4 !!!
这是因为
c
\u{20DD}
组合成了c⃝. 还要注意,我们使用的是
countElements
。为了计算出字符串的长度,Swift实际上必须遍历整个字符串,并计算出实际的字形划分在哪里,因此需要O(n)时间

我们还可以看到对不同编码的影响:

Array((str1+str2).utf8)  // [97, 98, 99, 226, 131, 157, 100, 101, 102]
Array((str1+str2).utf16) // [97, 98, 99, 8413, 100, 101, 102]
另一个问题是,正如您的错误所述,
String
IndexType
不再可从整数文本转换:您不能通过指定偏移量对字符串执行随机访问。相反,您可以使用
startIndex
advance
在字符串中向前移动一些距离,例如
str[str.startIndex]
str[advance(str.startIndex,distance)]

或者,您也可以同时定义自己的助手函数:

func at<C: Collection>(c: C, i: C.IndexType.DistanceType) -> C.GeneratorType.Element {
    return c[advance(c.startIndex, i)]
}

func take<C: protocol<Collection, Sliceable>>(c: C, n: C.IndexType.DistanceType) -> C.SliceType {
    return c[c.startIndex..<advance(c.startIndex, n)]
}

at(str1+str2, 3)   // d

take(str1+str2, 2) // ab
func at(c:c,i:c.IndexType.DistanceType)->c.GeneratorType.Element{
返回c[预付款(c.startIndex,i)]
}
func take(c:c,n:c.IndexType.DistanceType)->c.SliceType{

返回c[c.startIndex..出于您的担忧。从长远来看,正确支持grapheme集群可能是一个好的决定,但同时这会让字符串访问变得更痛苦。

在beta 4中,Swift的string.Index处理再次发生变化——您现在无法在需要
string.Index
时提供
Inty通过创建
字符串来处理它。索引
您需要使用
高级
方法:

if !name.isEmpty {
    var splitted: [String] = name.componentsSeparatedByString(" ")

    for curPart in splitted {
        if !curPart.isEmpty {
            acronym += curPart.substringToIndex(advance(curPart.startIndex, 1))
        }
    }
    if countElements(acronym) > 2 {
        acronym = acronym.substringToIndex(advance(acronym.startIndex, 2))
    }
}

这一切都是基于确保正确处理Unicode字符串——因为不同的Unicode字符可以有不同的大小,纯整数索引将隐藏字符串不是随机访问的事实。

对于Swift 2.0

使用上述示例:

curPart.substringToIndex(curPart.startIndex.advancedBy(1)) 

感谢您提供的解决方案!它可以编译并且似乎可以工作!谢谢。我还认为这将在swift 1.0之前发生变化“这都是基于确保正确处理Unicode字符串-由于不同的Unicode字符可以有不同的大小,纯整数索引将隐藏字符串不是随机访问的事实。”.我认为swift可以通过使用正好是一个unicode字符的
charcate
类型(而不是字节)来解决这个问题,而swift
String
s可以被认为是这样的数组?是什么阻碍了访问第n个(unicode)字符字符串的字符?不,每个
字符
都是字符串中的一个可见字符,可以由一个、两个或多个代码点组成。例如,如果您正在寻找一个使用Int来获取您可能需要的所有子字符串的扩展名,请尝试此扩展名:“访问第n个(unicode)的障碍是什么?”字符串的字符?”——斯威夫特的理念是,在编写代码时,您应该感受到Unicode字符串处理的运行时成本。昂贵的操作编写起来很痛苦。好了,现在我知道了幕后发生了什么:D谢谢!