首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >斯威夫特: String.removeSubrange - HowTo?

斯威夫特: String.removeSubrange - HowTo?
EN

Stack Overflow用户
提问于 2022-02-10 18:34:45
回答 1查看 309关注 0票数 1

当我想用Swift剪一根绳子的时候,我有点怀念他们想让我做的事情。他们告诉我斯威夫特是“客观的”。但它实际上是“行不通的”。我阅读的docs (https://developer.apple.com/documentation/swift/string/3018537-removesubrange)中解释了从字符串中移除子范围。但在我回到ObjC之前,让我问一个问题:

代码语言:javascript
运行
复制
measurements.removeSubrange(1..<4)

我做了

代码语言:javascript
运行
复制
logString = logString.removeSubrange(logSizeLimit..logString.count)

上面写着Cannot find operator '..' in scope; did you mean '...'?我把它改成了...。它现在告诉我:

代码语言:javascript
运行
复制
(1.) Cannot assign value of type '()' to type 'String'
(2.) Instance method 'removeSubrange' requires the types 'String.Index' and 'Int' be equivalent

这是我的密码:

代码语言:javascript
运行
复制
public let logSizeLimit = 40960
public var logString = ""
func senderLoggedMessage(_ message:String) {
    var msg = message + "\n"
    msg += logString
    logString = msg
    if logString.count > logSizeLimit {
        logString = logString.removeSubrange(logSizeLimit ... logString.count) // error line
    }
}

井。有人知道答案吗?

EN

回答 1

Stack Overflow用户

发布于 2022-02-10 19:48:56

您的代码有几个问题:

  1. removeSubrange是一个返回Void的变异方法。因此,logString.removeSubrange(_:)修改了logString的位置。它不返回新的String。在Objective中,-[NSMutableString deleteCharactersInRange:]方法会出现完全相同的问题。
  2. 您正在尝试使用IntString的字符进行索引,但是Swift Strings不使用Int索引。 有一种类型,String.Index,您可以使用它来索引到带有removeSubrange和其他函数的String中。但我不推荐。 Swift的String非常非常小心地正确处理Unicode。因此,与许多其他语言一样,String不仅仅是字节数组或UTF-16代码单元的数组。StringCharacter的集合,CharacterUnicode标准附件#29: Unicode文本分割中讨论的“用户感知的字符”。 Character‘a’是一个代码点(U+0061)和一个UTF-8编码单元,而Character‘‍‍‍’是七个编码点(U+1f468 U+200d U+1f469 U+200d U+1f467 U+200d U+1f466)和25个UTF-8编码单元。 因为Character中的每个String可能使用不同的存储量,所以操纵String.Index并不像操作Int那样简单。您必须在String上使用index(after:)distance(from:to:)等方法,而不是+-等运算符。

根据我的经验,使用像String.drop(while:)这样的操作来分割一个.prefix(_:)要容易得多。这些操作通常返回一个Substring。因此,在最后,如果需要,可以使用String.initSubstring转换回String

我会这样写你的函数:

代码语言:javascript
运行
复制
public let logSizeLimit = 40960
public var logString = ""
func senderLoggedMessage(_ message:String) {
    logString = String("\(message)\n\(logString)"
        .prefix(logSizeLimit))
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71070503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档