为什么Swift的enumerateSubstringsInRange回调采用可选字符串?

时间:2015-10-31 19:58:41

标签: swift optional

我们可以从Swift字符串中提取单词:

s.enumerateSubstringsInRange(s.characters.indices, options: .ByWords) {
    (w,_,_,_) in print(w!)
}

但是强制展开通常是代码味道。它就在那里,因为回调的第一个参数是String?(可选)。我已经尝试了几个可能的字符串,以强制函数将nil传递给回调(例如空字符串和没有字符的字符串),但没有运气!

所以我想知道为什么回调采用可选字符串。有没有我忽略的东西?是因为可变的字符串可以同时传入和修改吗?如果是这样,那么如果我知道我的原始字符串是一个常量(用let定义),那么它是否可以接受,以进行强制解包?

1 个答案:

答案 0 :(得分:2)

(以下信息来自对我的问题的回复 https://forums.developer.apple.com/thread/28272 Apple开发者论坛。)

您可以将.SubstringNotRequired选项传递给enumerateSubstringsInRange(),然后调用闭包 substring == nil。此选项为documented

  

<强> NSStringEnumerationSubstringNotRequired

     

一种表示块不需要子字符串的方法,其中   case nil将通过。这只是一个性能捷径。

示例:

let str = "Hello, playground"  
str.enumerateSubstringsInRange(str.characters.indices,
    options: [.ByWords, .SubstringNotRequired]) {
        substring, substringRange, _, _ in  
        print(substring, substringRange)  
}

输出:

nil 0..<5
nil 7..<17

我认为可以安全地假设substring != nil <{1}}没有给出选项。