使用NSStringEnumerationOptions.ByWords出错-Swift 4.2

时间:2019-03-10 03:09:54

标签: swift nsstring nsrange

我试图将此Extension添加到我的代码中,以便按单词枚举子字符串。该代码的源于2015年,因此显然是Swift的早期版本。我正在使用Swift4.2,但无法弄清楚如何正确地更新下面标识的行中的代码,并带有注释。

extension String {
    func words() -> [String] {

        let range = Range<String.Index>(start: self.startIndex, end: self.endIndex) // THIS LINE CAUSES ERROR
        var words = [String]()

        self.enumerateSubstringsInRange(range, options: NSStringEnumerationOptions.ByWords) { (substring, _, _, _) -> () in
            words.append(substring)
        }

        return words
    }
}

我最初收到以下错误消息: 调用中的参数标签不正确(具有“ start:end:”,预期为“ _:in:”)

我按照“修复”提示进行操作,并将其更改为:

let range = Range<String.Index>(self.startIndex, in: self.endIndex)

然后,我收到此错误,没有任何修复建议:

无法将类型“ String.Index”的值转换为预期的参数类型“ NSRange”(又名“ _NSRange”)

错误可能是由于Swift版本更新造成的,我无法确定编写此行的正确方法。

1 个答案:

答案 0 :(得分:0)

自Swift3以来,范围方法语法中的枚举子字符串有所变化:

新声明:

  

func enumerateSubstrings(范围:R,选项选择:   String.EnumerationOptions =默认值,_正文:@转义(字符串?,   范围,范围,inout布尔)->空隙)其中R   :RangeExpression,R.Bound == String.Index

extension String {
    func words() -> [String] {
        var words = [String]()
        enumerateSubstrings(in: startIndex..., options: .byWords) { substring, _, _, _ in
            words.append(substring!)
        }
        return words
    }
}

"abc def".words()  //  ["abc", "def"]

请注意,在Swift 4或更高版本中,您应该扩展StringProtocol而不是类型String本身以支持Substring。您可以在我发布的here

答案中查看如何实施