从Swift中特定索引的String中获取unicodeScalars字符

时间:2019-01-16 15:41:42

标签: swift string character unicodescalar

我正在使用此扩展名来获取特定索引中的字符;但是目前它无法识别unicodeScalars,您能帮我修复扩展名以获得所需的结果吗?

我在末尾进行了一些测试,以显示想要获得的结果(Test1和Test2)。

extension String {

var length: Int {
    return count
}

subscript (i: Int) -> String {
    return self[i ..< i + 1]
}

func substring(fromIndex: Int) -> String {
    return self[min(fromIndex, length) ..< length]
}

func substring(toIndex: Int) -> String {
    return self[0 ..< max(0, toIndex)]
}

subscript (r: Range<Int>) -> String {
    let range = Range(uncheckedBounds: (lower: max(0, min(length, r.lowerBound)),
                                        upper: min(length, max(0, r.upperBound))))
    let start = index(startIndex, offsetBy: range.lowerBound)
    let end = index(start, offsetBy: range.upperBound - range.lowerBound)
    return String(self[start ..< end])
  }

}


//How to Use the Extension:
//let str = "abcdef"
//str[1 ..< 3] // returns "bc"
//str[5] // returns "f"
//str[80] // returns ""
//str.substring(fromIndex: 3) // returns "def"
//str.substring(toIndex: str.length - 2) // returns "abcd"



var Test1 = "دب"
var Test2 = "دُبْ"

print(Test1[1]) //returns " ب " which is correct in this case
print(Test2[1]) // returns " بْ " where I want it to return the mark which is " ُ "

Test1是不带标记的文本,它的位置在正确的“ب”上,但是Test2包含的标记只能被unicodeScalars识别为字符,在Test2中,它的位置是错误的,并且显示带有标记的整个字符بْ“,我只希望它显示标记” ُ“

谢谢。

1 个答案:

答案 0 :(得分:1)

如果要下标String.unicodeScalars而不是String本身,请在String.UnicodeScalarView而不是String上声明扩展名。

extension String.UnicodeScalarView {

    var length: Int {
        return count
    }

    subscript (i: Int) -> String {
        return self[i ..< i + 1]
    }

    func substring(fromIndex: Int) -> String {
        return self[Swift.min(fromIndex, length) ..< length]
    }

    func substring(toIndex: Int) -> String {
        return self[0 ..< Swift.max(0, toIndex)]
    }

    subscript (r: Range<Int>) -> String {
        let range = Range(uncheckedBounds: (lower: Swift.max(0, Swift.min(length, r.lowerBound)),
                                            upper: Swift.min(length, Swift.max(0, r.upperBound))))
        let start = index(startIndex, offsetBy: range.lowerBound)
        let end = index(start, offsetBy: range.upperBound - range.lowerBound)
        return String(self[start ..< end])
    }

}

然后只需

var test1 = "دب"
var test2 = "دُبْ"

test1.unicodeScalars[1] // "ب" 
test2.unicodeScalars[1] // "ُ "