'NSString'不是'String'的子类型

时间:2015-03-06 18:14:17

标签: ios string swift

var sectionTitles: [String] = ["Apple", "Brownie", "Cupcakes"]

var sectionIndexTitles: [String]{
    get{

        return sectionTitles.map { $0.substringToIndex(2) }

    }
}

我在sectionIndexTitles上遇到'NSString' is not a subtype of 'String'的编译错误。我该如何解决?

3 个答案:

答案 0 :(得分:3)

您需要将String强制转换为NSString。请参阅以下代码:

var sectionIndexTitles: [String]{
        get{
            return sectionTitles.map {
                ($0 as NSString).substringToIndex(2)
            }
        }
    }

<强>更新 因为你没有使用setter,你可以通过省略这样的getter声明来简化这段代码:

var sectionIndexTitles: [String] {
        return sectionTitles.map { ($0 as NSString).substringToIndex(2) }
    }

答案 1 :(得分:1)

substringToIndex()NSString都存在String方法,但是 这两种方法有不同的参数类型。

NSString方法 需要Int,因此您可以将$0投射到NSString,如图所示 Roman Salabay的回答。

String方法采用String.Index参数,看起来如此 有点复杂:

var sectionIndexTitles: [String] {
    get {
        return sectionTitles.map {
            $0.substringToIndex(advance($0.startIndex, 2, $0.endIndex))
        }
    }
}

但是,有一个通用的

func prefix<S : Sliceable>(s: S, maxLength: Int) -> S.SubSlice

可以在这里使用的方法:

var sectionIndexTitles: [String] {
    get {
        return sectionTitles.map {
            prefix($0, 2)
        }
    }
}

答案 2 :(得分:0)

此处未经过NSString转化:

let sectionTitles = ["hello", "world"]
let xs = sectionTitles.map { $0.substringToIndex(advance($0.startIndex, 2))}
xs // ["he", "wo"]

问题是String有自己的Index类型。这主要是由于它处理的各种UTF表示。 AFAIK NSString主要使用UTF-8内部表示。