Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何在替换++;斯威夫特的接线员?_Swift_While Loop_Increment - Fatal编程技术网

Swift 如何在替换++;斯威夫特的接线员?

Swift 如何在替换++;斯威夫特的接线员?,swift,while-loop,increment,Swift,While Loop,Increment,新的Xcode(7.3)警告说,增量运算符++将在下一个swift3中删除。我使用++进行了while循环(见下文)。在我删除增量操作符++之后,这个循环比使用++慢三倍。改变这个while循环的更好方法是什么 以前 var first = string1.startIndex var last = first.advancedBy(n, limit: string1.endIndex) var myarray = [String]() while last != string1.en

新的Xcode(7.3)警告说,增量运算符++将在下一个swift3中删除。我使用++进行了while循环(见下文)。在我删除增量操作符++之后,这个循环比使用++慢三倍。改变这个while循环的更好方法是什么

以前

 var first = string1.startIndex
 var last = first.advancedBy(n, limit: string1.endIndex)
 var myarray = [String]()

 while last != string1.endIndex
 {
     myarray.append(string1[first++...last++])
 } 
之后

 var first = string1.startIndex
 var last = first.advancedBy(n, limit: string1.endIndex)
 var myarray = [String]()

 while last != string1.endIndex
 {
    myarray.append(string1[first...last])

    first = first.advancedBy(1) // or first = first.successor()
    last = first.advancedBy(n, limit: string1.endIndex) // or  last = last.successor()

 }

将增量从
first++
更改为
first++=1
——这是关于不推荐版本的原则

但如果进行深入搜索,您会发现
increment
over
String.CharacterView.Index
实现了自定义后缀运算符,其中接受带有
\u Incrementable
协议的泛型,该协议声明了
继任者
方法以返回下一个链值。
为什么
++
比直接
后继者快
——谁知道呢,显然有些优化正在开发中,在Swift 3中会有更好的速度。

将增量从
first++
更改为
first+=1
——这是关于不推荐版本的原则

但如果进行深入搜索,您会发现
increment
over
String.CharacterView.Index
实现了自定义后缀运算符,其中接受带有
\u Incrementable
协议的泛型,该协议声明了
继任者
方法以返回下一个链值。
为什么
++
比直接
后继
更快?谁知道呢,显然有些优化正在开发中,在Swift 3中将有更好的速度。

为什么不使用for循环而不是一段时间,然后使用索引直接访问

var myarray = [String]()
for var i in string1.startIndex ... string1.endIndex {
    myarray.append(string1[i])
}

希望能有所帮助。

为什么不使用for循环而不是使用while,然后直接使用索引进行访问呢

var myarray = [String]()
for var i in string1.startIndex ... string1.endIndex {
    myarray.append(string1[i])
}

希望这会有帮助。

有什么原因不能将递增放在单独的行中吗

while last != string1.endIndex
 {
     first += 1
     last += 1
     myarray.append(string1[first...last])
 } 

有什么原因不能将递增放在单独的行上吗

while last != string1.endIndex
 {
     first += 1
     last += 1
     myarray.append(string1[first...last])
 } 
使用预分配和随机访问分配,而不是重复地将元素附加到数组中 添加行
first=…
last=…
不会对性能产生太大的影响,就像将元素反复添加(从而反复扩展数组)到未预先分配的数组一样。如果您初始化数组
myarray
并使用随机访问(
myarray[i]
)来分配滑动窗口字符串值,而不是使用
。append(…)
,则应该能够减少开销

基准测试结果(使用

  • 预先初始化的阵列解决方案,使用
    for i in…
    循环:2.5s
  • .append(..)
    解决方案,使用
    while
    循环,如您的问题所示:32.5s
如果执行时间很重要,那么您显然可以通过预先初始化数组并使用随机访问分配而不是重复使用
.append(…)
来获益


最后,您可以问自己是否真的需要显式地存储滑动窗口中的所有子字符串,或者它是否足以存储对应于它们的范围。如果
n
较大,则上面的
myarray
将包含大量重复字符/重叠子字符串。在这种情况下,您最好只保存一个
Range
元素数组,该数组可以随时用于提取
string1
的相关子字符串。例如:

var first = string1.startIndex
var last = first.advancedBy(n, limit: string1.endIndex)
var rangeArr = [Range<String.CharacterView.Index>](
        count: string1.characters.count-n,
        repeatedValue: first...last)

for i in 0..<rangeArr.count {
    rangeArr[i] = first...last

    first = first.advancedBy(1)
    last = first.advancedBy(n, limit: string1.endIndex)
}
var first=string1.startIndex
var last=first.advancedBy(n,限制:string1.endIndex)
var rangeArr=[范围](
count:string1.characters.count-n,
repeatedValue:第一个…最后一个)
对于0中的i..使用预分配和随机访问分配,而不是重复将元素附加到数组中
添加行
first=…
last=…
不会对性能产生太大的影响,就像将元素反复添加(从而反复扩展数组)到未预先分配的数组一样。如果您初始化数组
myarray
并使用随机访问(
myarray[i]
)来分配滑动窗口字符串值,而不是使用
。append(…)
,则应该能够减少开销

基准测试结果(使用

  • 预先初始化的阵列解决方案,使用
    for i in…
    循环:2.5s
  • .append(..)
    解决方案,使用
    while
    循环,如您的问题所示:32.5s
如果执行时间很重要,那么您显然可以通过预先初始化数组并使用随机访问分配而不是重复使用
.append(…)
来获益


最后,您可以问自己是否真的需要显式地存储滑动窗口中的所有子字符串,或者它是否足以存储对应于它们的范围。如果
n
较大,则上面的
myarray
将包含大量重复字符/重叠子字符串。在这种情况下,您最好只保存一个
Range
元素数组,该数组可以随时用于提取
string1
的相关子字符串。例如:

var first = string1.startIndex
var last = first.advancedBy(n, limit: string1.endIndex)
var rangeArr = [Range<String.CharacterView.Index>](
        count: string1.characters.count-n,
        repeatedValue: first...last)

for i in 0..<rangeArr.count {
    rangeArr[i] = first...last

    first = first.advancedBy(1)
    last = first.advancedBy(n, limit: string1.endIndex)
}
var first=string1.startIndex
var last=first.advancedBy(n,限制:string1.endIndex)
var rangeArr=[范围](
count:string1.characters.count-n,
repeatedValue:第一个…最后一个)

对于0中的i..如果我使用first+=1而不是first.advancedBy(1),则它不起作用,因为+=未应用于Index.hmm,因此,请等待改进。。。也许是的,也许不是,如果我用first+=1代替first,这不是一个好方法。advancedBy(1)它不起作用,因为+=不应用于Index.hmm,所以,等待改进的时间到了。。。也许是,也许不是,不是一个好的方法你确定你也看到了表演吗