为什么会这样:
let i = 1...100
let s = [Int](i)
产量
[1, 2, 3, ..., 100]
但
let i = "a"..."z"
let s = [String](i)
产量
Cannot invoke initializer for type '[String]' with an argument list of type '(ClosedInterval<String>)'
然而
i.contains("b")
产量
true
Int
符合ForwardIndexType
,因此
let i = 1...100
...
是运算符
public func ...<Pos : ForwardIndexType where Pos : Comparable>(start: Pos, end: Pos) -> Range<Pos>
结果是Range<Int>
。范围是集合和序列:可以枚举范围的元素并从中创建数组。
但是String
并且Character
不符合ForwardIndexType
:没有方法可以从一个字符串或字符前进到下一个字符串或字符。因此在
let i = "a"..."z"
...
是运算符
public func ...<Bound : Comparable>(start: Bound, end: Bound) -> ClosedInterval<Bound>
结果是ClosedInterval<String>
。您可以检查该间隔中是否包含特定的字符串,但是不能枚举其元素。
"a"..."z"
代表所有字符串s
为其"a" <= s <= "z"
根据Unicode标准,并从英文字母不只是26个个小写字母,比较例如是什么意思斯威夫特该字符串和字符比较不区分语言环境?。例如
let c = i.contains("ä")
产量true
。
在Swift 3中,范围和间隔类型已重命名并重新组织:
"1" ... "100" // CountableClosedRange<Int>
"a" ... "z" // ClosedRange<String>
如果您打算根据Unicode表中从“ a”到“ z”的所有字符创建一个数组,则可以枚举UTF-32
代码单元:
let i = UnicodeScalar("a").value ... UnicodeScalar("z").value
let charArray = (i.map { Character(UnicodeScalar($0)) })
// or
let stringArray = (i.map { String(UnicodeScalar($0)) })
结果是
["a", "b", "c", ... , "z"]
作为的数组Character
或的数组String
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句