2014-10-27 42 views

回答

5

或者,也许还有另一种varaible键入多个范围?

是的,NS(Mutable)IndexSet将(唯一的)无符号整数的集合存储为一系列范围。

举例:创建一个可变的指标集,并添加两个范围和单一指标:

let indexSet = NSMutableIndexSet() 
indexSet.addIndexesInRange(NSMakeRange(0, 2)) 
indexSet.addIndexesInRange(NSMakeRange(10, 3)) 
indexSet.addIndex(5) 
println(indexSet) 
// <NSMutableIndexSet: 0x10050a510>[number of indexes: 6 (in 3 ranges), indexes: (0-1 5 10-12)] 

枚举所有索引:

indexSet.enumerateIndexesUsingBlock { (index, stop) -> Void in 
    println(index) 
} 
// Output: 0 1 5 10 11 12 

枚举所有范围:

indexSet.enumerateRangesUsingBlock { (range, stop) -> Void in 
    println(range) 
} 
// Output: (0,2) (5,1) (10,3) 

测试会员:

if indexSet.containsIndex(11) { 
    // ... 
} 

但请注意,NSIndexSet代表设置,即没有重复的元素, 和元素的顺序并不重要。根据您的需求,这可能会或可能不会 有用。例如:

let indexSet = NSMutableIndexSet() 
indexSet.addIndexesInRange(NSMakeRange(0, 4)) 
indexSet.addIndexesInRange(NSMakeRange(2, 4)) 
indexSet.enumerateRangesUsingBlock { (range, stop) -> Void in 
    println(range) 
} 
// Output: (0,6) 
1

单个NSRange变量可以保存单个范围。如果您需要存储多个范围,使一个数组:

var multipleRanges: [NSRange] = [NSMakeRange(0, 2), NSMakeRange(10, 1)] 
//    ^ ^
//     |  | 
// This tells Swift that you are declaring an array, and that array elements 
// are of NSRange type. 

你也可以省略类型,并让编译器推断它为您:

// This is the same declaration as above, but now the type of array element 
// is specified implicitly through the type of initializer elements: 
var multipleRanges = [NSMakeRange(0, 2), NSMakeRange(10, 1)] 
+0

你也可以省略类型的注释和让编译器推断出类型:'变种multipleRanges = [NSMakeRange(0,2),NSMakeRange(10,1)]'。 – 2014-10-27 13:51:15

+0

@MartinR非常感谢您的编辑建议! – dasblinkenlight 2014-10-27 14:05:55

相关问题