我们可以从Swift字符串中提取单词:
s.enumerateSubstringsInRange(s.characters.indices, options: .ByWords) {
(w,_,_,_) in print(w!)
}
但是强制展开通常是代码味道。它就在那里,因为回调的第一个参数是String?
(可选)。我已经尝试了几个可能的字符串,以强制函数将nil
传递给回调(例如空字符串和没有字符的字符串),但没有运气!
所以我想知道为什么回调采用可选字符串。有没有我忽略的东西?是因为可变的字符串可以同时传入和修改吗?如果是这样,那么如果我知道我的原始字符串是一个常量(用let
定义),那么它是否可以接受,以进行强制解包?
答案 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}}没有给出选项。