如何在Swift中返回Int范围?

时间:2016-01-21 08:41:15

标签: swift

如何从Swift中的函数返回Int范围?我搜索了Swift 2.1文档,网络,SO,并尝试了:

func myfunc() -> Range { // }
func myfunc() -> ( Int ... Int ) { // }
func myfunc() -> Range< Int >  { // }

......和其他许多人......

很抱歉这里感到头疼,并提前感谢!

2 个答案:

答案 0 :(得分:5)

你的第三个是正确的。这编译和工作,例如:

func oneTo10() -> Range<Int> { 
   return 1...10 
}  

答案 1 :(得分:2)

使用Swift 3时,Range的范围比之前更小,并且与对应的ClosedRange一致。您现在在标准库中还有CountableClosedRangeCountableRange符合Strideable协议的对象(包括Int)。

因此,根据您的需要,您可以按照以下示例之一的模式重构您的代码:

#1。使用CountableClosedRange

func myfunc() -> CountableClosedRange<Int> {
    return 1 ... 10
}
print(Array(myfunc())) // prints [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

#2。使用CountableRange

func myfunc() -> CountableRange<Int> {
    return 1 ..< 11
}
print(Array(myfunc())) // prints [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

#3。使用ClosedRange

func myfunc() -> ClosedRange <Int> {
    return 1 ... 10
}

#4。使用Range

func myfunc() -> Range<Int> {
    return 1 ..< 11
}

请注意,使用Swift 3时,RangeClosedRange不符合Sequence协议。因此,以下代码将无法编译:

func myfunc() -> Range<Int> {
    return 1 ..< 11
}
print(Array(myfunc())) // error: Argument type 'Range<Int>' does not conform to expected type 'Sequence'

因此,除非您有充分的理由将RangeClosedRange用于符合Strideable(包括Int)的类型,否则您应该依赖{{1他们和CountableRange