当我想用Swift剪一根绳子的时候,我有点怀念他们想让我做的事情。他们告诉我斯威夫特是“客观的”。但它实际上是“行不通的”。我阅读的docs (https://developer.apple.com/documentation/swift/string/3018537-removesubrange)中解释了从字符串中移除子范围。但在我回到ObjC之前,让我问一个问题:
measurements.removeSubrange(1..<4)
我做了
logString = logString.removeSubrange(logSizeLimit..logString.count)
上面写着Cannot find operator '..' in scope; did you mean '...'?
我把它改成了...
。它现在告诉我:
(1.) Cannot assign value of type '()' to type 'String'
(2.) Instance method 'removeSubrange' requires the types 'String.Index' and 'Int' be equivalent
这是我的密码:
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
}
}
井。有人知道答案吗?
发布于 2022-02-10 19:48:56
您的代码有几个问题:
removeSubrange
是一个返回Void
的变异方法。因此,logString.removeSubrange(_:)
修改了logString
的位置。它不返回新的String
。在Objective中,-[NSMutableString deleteCharactersInRange:]
方法会出现完全相同的问题。Int
对String
的字符进行索引,但是Swift String
s不使用Int
索引。
有一种类型,String.Index
,您可以使用它来索引到带有removeSubrange
和其他函数的String
中。但我不推荐。
Swift的String
非常非常小心地正确处理Unicode。因此,与许多其他语言一样,String
不仅仅是字节数组或UTF-16代码单元的数组。String
是Character
的集合,Character
是Unicode标准附件#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.init
将Substring
转换回String
。
我会这样写你的函数:
public let logSizeLimit = 40960
public var logString = ""
func senderLoggedMessage(_ message:String) {
logString = String("\(message)\n\(logString)"
.prefix(logSizeLimit))
}
https://stackoverflow.com/questions/71070503
复制相似问题