作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
在 Objective-c 中,我们使用 NSRange 创建范围
NSRange range;
最佳答案
为 Swift 4 更新
Swift 范围比 NSRange
更复杂,并且它们在 Swift 3 中并没有变得更容易。如果你想尝试理解这种复杂性背后的原因,请阅读 this和 this .我只会向您展示如何创建它们以及何时可以使用它们。
封闭范围:a...b
此 range operator创建一个包含两个元素 a
的 Swift 范围和元素 b
,即使 b
是类型的最大可能值(如 Int.max
)。有两种不同类型的封闭范围:ClosedRange
和 CountableClosedRange
.
1. ClosedRange
Swift 中所有范围的元素都是可比较的(即,它们符合 Comparable 协议(protocol))。这允许您访问集合中范围内的元素。下面是一个例子:
let myRange: ClosedRange = 1...3
let myArray = ["a", "b", "c", "d", "e"]
myArray[myRange] // ["b", "c", "d"]
ClosedRange
不可数(即不符合 Sequence 协议(protocol))。这意味着你不能用
for
迭代元素。循环。为此,您需要
CountableClosedRange
.
CountableClosedRange
let myRange: CountableClosedRange = 1...3
let myArray = ["a", "b", "c", "d", "e"]
myArray[myRange] // ["b", "c", "d"]
for index in myRange {
print(myArray[index])
}
a..<b
a
但不是元素
b
.像上面一样,有两种不同类型的半开范围:
Range
和
CountableRange
.
Range
ClosedRange
一样,您可以使用
Range
访问集合的元素.示例:
let myRange: Range = 1..<3
let myArray = ["a", "b", "c", "d", "e"]
myArray[myRange] // ["b", "c"]
Range
因为它只有可比性,没有可比性。
CountableRange
CountableRange
允许迭代。
let myRange: CountableRange = 1..<3
let myArray = ["a", "b", "c", "d", "e"]
myArray[myRange] // ["b", "c"]
for index in myRange {
print(myArray[index])
}
NSRange
有时在 Swift 中(例如,在制作
attributed strings 时),所以知道如何制作一个很有帮助。
let myNSRange = NSRange(location: 3, length: 2)
3..<5
的含义相似。 .但是,由于类型不同,它们不能互换。
...
和
..<
范围运算符是创建范围的一种简写方式。例如:
let myRange = 1..<3
let myRange = CountableRange<Int>(uncheckedBounds: (lower: 1, upper: 3)) // 1..<3
Int
.这不适用于
String
,不过,因为字符串是由字符组成的,并非所有字符的大小都相同。 (阅读
this 了解更多信息。)例如,像 😀 这样的表情符号比字母“b”占用更多的空间。
NSRange
和一个
NSString
用表情符号,你就会明白我的意思。头痛。
let myNSRange = NSRange(location: 1, length: 3)
let myNSString: NSString = "abcde"
myNSString.substring(with: myNSRange) // "bcd"
let myNSString2: NSString = "a😀cde"
myNSString2.substring(with: myNSRange) // "😀c" Where is the "d"!?
Range<String.Index>
,不是
Range<Int>
.字符串索引是基于特定字符串计算的,因此它知道是否有任何表情符号或扩展字素簇。
var myString = "abcde"
let start = myString.index(myString.startIndex, offsetBy: 1)
let end = myString.index(myString.startIndex, offsetBy: 4)
let myRange = start..<end
myString[myRange] // "bcd"
myString = "a😀cde"
let start2 = myString.index(myString.startIndex, offsetBy: 1)
let end2 = myString.index(myString.startIndex, offsetBy: 4)
let myRange2 = start2..<end2
myString[myRange2] // "😀cd"
a...
和
...b
和
..<b
// iterate from index 2 to the end of the array
for name in names[2...] {
print(name)
}
// iterate from the beginning of the array to index 2
for name in names[...2] {
print(name)
}
// iterate from the beginning of the array up to but not including index 2
for name in names[..<2] {
print(name)
}
// the range from negative infinity to 5. You can't iterate forward
// over this because the starting point in unknown.
let range = ...5
range.contains(7) // false
range.contains(4) // true
range.contains(-1) // true
// You can iterate over this but it will be an infinate loop
// so you have to break out at some point.
let range = 5...
str.startIndex
制作范围或
str.endIndex
一方面,您可以将其关闭。编译器会推断出来。
var str = "Hello, playground"
let index = str.index(str.startIndex, offsetBy: 5)
let myRange = ..<index // Hello
...
从索引转到 str.endIndex
var str = "Hello, playground"
let index = str.index(str.endIndex, offsetBy: -10)
let myRange = index... // playground
关于swift - 如何在 Swift 中创建范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30093688/
我是一名优秀的程序员,十分优秀!