如何将Range <int>转换为Set <int>?

时间:2016-11-15 10:37:49

标签: swift set

我想将Range Int转换为Set<Int>这样的

[0..<count] - &gt; Set[1,2,3..count]

2 个答案:

答案 0 :(得分:4)

(可数)范围是序列,Set有初始化程序

public init<Source : Sequence where Source.Iterator.Element == Element>(_ sequence: Source)

允许直接从序列创建集合:

let count = 10
let range = 0..<count // CountableRange<Int>
let set = Set(range)  // Set<Int>

或者只是

let count = 10
let set = Set(0..<count) // Set<Int>

或者

let set = Set(0..<10)  // Set<Int>

请注意,还有IndexSet这是一种专用类型 管理(非负)整数值集:

let indexSet = IndexSet(0..<10)

答案 1 :(得分:0)

在Swift 5中,Set有一个名为Promisify的初始化程序。 init(_:)具有以下声明:

init<Source>(_ sequence: Source) where Element == Source.Element, Source : Sequence   
  

从有限的项目序列中创建一个新集合。

下面的Playground示例代码显示了如何使用init(_:)来将范围转换为集合:

let count: Int = 10
let range: Range<Int> = 0 ..< count
let set: Set<Int> = Set(range)

print(range) // prints: 0..<10
print(set) // prints: [1, 4, 0, 9, 3, 6, 5, 7, 2, 8]

或者,您可以使用以下IndexSet的以下两个初始化方法之一init(_:)init(_:)将范围转换为IndexSet实例。

下面的Playground示例代码显示了如何使用init(_:)init(integersIn:)来将范围转换为集合:

import Foundation

let count: Int = 10
let range: Range<Int> = 0 ..< count
let indexSet: IndexSet = IndexSet(range)
//let indexSet: IndexSet = IndexSet(integersIn: range) // also works

print(range) // prints: 0..<10
print(indexSet) // prints: 10 indexes

for range in indexSet.rangeView {
    print(range) // prints: 0..<10
}