'init(start:end:)'已被弃用:它将在Swift 3中被移除。请使用'..<'运算符。

72

我正在使用以下代码:

var continousDigitsRange:Range<Int> = Range<Int>(start: 0, end: 0)

自从更新到Xcode 7.3(Swift 2.2)之后,我得到了以下提示:

'init(start:end:)'已弃用:它将在Swift 3中被删除。请使用'..<'运算符。

对我来说,如何正确地使用“..<”运算符进行“翻译”还不清楚。


对于每个项目在 0 ..< items 中执行 {},对于每个项目在 0 ... 100 中执行 {}。 - Anton
https://dev59.com/6V0a5IYBdhLWcg3woaA3#30094120 - Leo Dabus
6个回答

88
你只需要简单地写。
var continousDigitsRange1:Range<Int> = 0..<0

或者,如果你想更简单一些

var continousDigitsRange = 0..<0

35

值得注意的是,现在可以使用substringWithRange方法对字符串进行子字符串截取。

let theString = "Hello, how are you"
let range = theString.startIndex.advancedBy(start) ..< theString.startIndex.advancedBy(end)
theString.substringWithRange(range)

1
有一点小事需要注意,如果你要从字符串的末尾开始计数,使用endIndex而不是start,就像下面这样: 'let range = theString.startIndex.advancedBy(start) ..< theString.endIndex.advancedBy(end)' - Hamid

8
封闭范围运算符 (a...b) 定义了一个从 a 到 b 的范围,并包括值 a 和 b。其中,a 的值不能大于 b。
半开范围运算符 (a..<b) 定义了一个从 a 到 b 的范围,但不包括 b。由于它包含第一个值,但不包含最后一个值,因此被称为半开运算符。与封闭范围运算符一样,a 的值也不能大于 b。如果 a 的值等于 b,则生成的范围为空。 Swift 编程语言 (Swift 2.2) - 基本运算符
var continousDigitsRange:Range<Int> = Range<Int>(start: 0, end: 0)
--to--
var continousDigitsRange:Range<Int> = 0..<0

1
啊,是的,好观点,我改了 - 想展示Swift中的范围选项。 - solenoid
连续数字范围中最终是什么?在我看来好像是nil。这个范围有什么用处呢?我也在尝试学习! - user462990

2

展示bmichotte的完整答案...

let theString = "Hello, how are you today my friend"
    let start = 3
    let end = 15
    let range = theString.startIndex.advancedBy(start) ..< theString.startIndex.advancedBy(end)
    let p = theString.substringWithRange(range)
    print("this is the middle bit>\(p)<")

这将产生这是中间的部分>嗨,你好<。

1

针对 Swift 3.0,以下是一些补充说明:

//可数范围示例。

let range1 = 0..<5

可数闭合范围示例

let range2 = 0...5

//范围从边界开始

let range = Range(uncheckedBounds: (range1.lowerBound,range1.upperBound))

//获取子字符串范围的距离。

let str = "Hello, how are you"
let substringRange = str.characters.indices

// 在 Swift 3.0 以下

let length = substringRange.distance(from: substringRange.startIndex, to: substringRange.endIndex)

//针对Swift 3.0

let length2 = str.distance(from: substringRange.startIndex, to: substringRange.endIndex)

1

我一直有一个获取字符串子串范围的函数。以下是我针对Swift 3更新的函数:

func getSubStringRange(fullString: String, fromIndex: Int, subStringSize: Int) -> Range<String.Index> {
    let startIndex = fullString.characters.index(fullString.startIndex, offsetBy: fromIndex)
    let endIndex = fullString.characters.index(startIndex, offsetBy: subStringSize)

    let subStringRange = startIndex..<endIndex

    return subStringRange
}

该函数非常自解释 - 您传入一个字符串(fullString),该字符串的子字符串起始索引(fromIndex)以及子字符串的大小(subStringSize)。

例如:

let greeting = "Hi, my name is Nathaniel"
let getName = greeting[getSubStringRange(fullString: greeting, fromIndex: 15, subStringSize: 9)]

print("Name: \(getName)")

-> 打印:"Name: Nathaniel"


1
无法使用Swift 3编译。在“subStringSize: Int”后面没有闭合的 - Vlad
1
endIndex 属性中,你忘记了在 startIndex 之前加上 fullString. ,所以正确的写法应该是:let endIndex = fullString.characters.index(fullString.startIndex, offsetBy: subStringSize) - Mette
谢谢大家。我打那段话的时候可能还在睡觉!因为我当时是在Windows电脑上发帖,所以只能手动输入整个代码,而不能直接复制粘贴。 - Krivvenz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接