使用NSStringEnumerationOptions.ByWords获取错误 - Swift 4.2

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用NSStringEnumerationOptions.ByWords获取错误 - Swift 4.2相关的知识,希望对你有一定的参考价值。

我试图将这个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版本更新,我无法弄清楚写这行的正确方法。

答案

自Swift3以来,范围方法语法中的枚举子字符串发生了一些变化:

新声明:

func enumerateSubstrings(范围:R,选项opts:String.EnumerationOptions = default,_ body:@escaping(String?,Range,Range,inout Bool) - > Void)其中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本身以支持Substrings。您可以在我发布here的答案中查看如何实现它

以上是关于使用NSStringEnumerationOptions.ByWords获取错误 - Swift 4.2的主要内容,如果未能解决你的问题,请参考以下文章

在使用加载数据流步骤的猪中,使用(使用 PigStorage)和不使用它有啥区别?

今目标使用教程 今目标任务使用篇

Qt静态编译时使用OpenSSL有三种方式(不使用,动态使用,静态使用,默认是动态使用)

MySQL db 在按日期排序时使用“使用位置;使用临时;使用文件排序”

使用“使用严格”作为“使用强”的备份

Kettle java脚本组件的使用说明(简单使用升级使用)