gpt4 book ai didi

Swift - endIndex.predecessor()

转载 作者:行者123 更新时间:2023-11-30 10:01:55 28 4
gpt4 key购买 nike

这些评论有道理吗?试图找出为什么它删除了我的反向给定字符串的字符,而不是本例中的常规给定字符串。

import Foundation

extension String {
func reverseWords() -> String {
var result = ""

let words = self.componentsSeparatedByString(" ")
for thisWord in words.reverse() {
result += thisWord + " "
}

print("..\(result)..")
// Result is the words array ( contains self ) reversed with seperator " "

print("..\(self)..")

result.removeAtIndex(self.endIndex.predecessor())
// So here i am checking self within result?, and am removing the last index
// of my currently reversed given string inside result?
// I do result in my intended last space removal with result.endIndex but i'm
// wondering what happens in this case with the self.endIndex :)

return result

}
}

var str = "This string contains a few elements"
str.reverseWords()

最佳答案

self 仍然引用原始的未反转的 String

正确的代码是:

result.removeAtIndex(result.endIndex.predecessor()) 

您永远不应该将String 索引用于另一个字符串。如果您要对 result 建立索引,则不应使用 self 中的索引。

对于一个简单的字符串,你看起来不会有什么不同,但如果你开始添加多字节字符,例如表情符号,您的应用程序可能会崩溃。

例如,使用 result += thisWord + "😀" 将导致:

elements😀few😀a😀contains😀string�This😀

self.endIndex

elements😀few😀a😀contains😀string😀This

result.endIndex

endIndex 是超过String 末尾的索引。它的工作原理与数组的 count 相同。数组中的 count 不代表最后一个元素,count - 1 代表最后一个元素。

如果您的目标是更改原始String,则必须将该方法声明为mutating并分配给self,例如:

mutating func reverseWords() {
var result = ""

let words = self.componentsSeparatedByString(" ")
for thisWord in words.reverse() {
result += thisWord + " "
}

self = result
self.removeAtIndex(self.endIndex.predecessor())
}

尽管这在函数式编程中相当罕见。

关于Swift - endIndex.predecessor(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38059489/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com