Bar*_*nes 38 string swift swift4
在斯威夫特4,当我尝试采取我得到这个错误Substring
上String
使用标语法.
'subscript'不可用:不能使用CountableClosedRange下标String,请参阅文档注释以供讨论
例如:
let myString: String = "foobar"
let mySubstring: Substring = myString[1..<3]
Run Code Online (Sandbox Code Playgroud)
两个问题:
p-s*_*sun 63
"palindrome"[1..<3]
和"palindrome"[1...3]
使用这些扩展.斯威夫特4
extension String {
subscript (bounds: CountableClosedRange<Int>) -> String {
let start = index(startIndex, offsetBy: bounds.lowerBound)
let end = index(startIndex, offsetBy: bounds.upperBound)
return String(self[start...end])
}
subscript (bounds: CountableRange<Int>) -> String {
let start = index(startIndex, offsetBy: bounds.lowerBound)
let end = index(startIndex, offsetBy: bounds.upperBound)
return String(self[start..<end])
}
}
Run Code Online (Sandbox Code Playgroud)
斯威夫特3
对于Swift 3替换为return self[start...end]
和return self[start..<end]
.
String.Index
.Cod*_*ent 19
你的问题(和自我回答)有两个问题:
订阅字符串Int
从未在Swift的标准库中提供.只要Swift存在,此代码就无效:
let mySubstring: Substring = myString[1..<3]
Run Code Online (Sandbox Code Playgroud)
new String.Index(encodedOffset: )
返回UTF-16(16位)编码的索引.Swift的字符串使用Extended Grapheme Cluster,它可以在8到64位之间存储一个字符.Emojis做了非常好的演示:
let myString = ""
let lowerBound = String.Index(encodedOffset: 1)
let upperBound = String.Index(encodedOffset: 3)
let mySubstring = myString[lowerBound..<upperBound]
// Expected: Canadian and UK flags
// Actual : gibberish
print(mySubstring)
Run Code Online (Sandbox Code Playgroud)
实际上,String.Index
无论好坏,获取Swift 4中都没有改变:
let myString = ""
let lowerBound = myString.index(myString.startIndex, offsetBy: 1)
let upperBound = myString.index(myString.startIndex, offsetBy: 3)
let mySubstring = myString[lowerBound..<upperBound]
print(mySubstring)
Run Code Online (Sandbox Code Playgroud)
Bar*_*nes 14
- 我该如何解决这个错误?
此错误意味着您不能在下标格式中使用Int - 您必须使用String.Index,您可以使用encodedOffset Int初始化它.
let myString: String = "foobar"
let lowerBound = String.Index.init(encodedOffset: 1)
let upperBound = String.Index.init(encodedOffset: 3)
let mySubstring: Substring = myString[lowerBound..<upperBound]
Run Code Online (Sandbox Code Playgroud)
- 错误中提到的"讨论文档评论"在哪里?
它位于Swift标准库存储库中的GitHub上,位于一个名为UnavailableStringAPIs.swift.gyb的文件中,位于一个锁定的文件柜底部,卡在一个废弃的厕所中,门上有一个标语,"小心豹子".链接
小智 12
您可以将字符串转换为字符数组...
let aryChar = Array(myString)
Run Code Online (Sandbox Code Playgroud)
然后你会得到所有的数组功能......
基于p-sun的回答
雨燕4
extension StringProtocol {
subscript(bounds: CountableClosedRange<Int>) -> SubSequence {
let start = index(startIndex, offsetBy: bounds.lowerBound)
let end = index(start, offsetBy: bounds.count)
return self[start..<end]
}
subscript(bounds: CountableRange<Int>) -> SubSequence {
let start = index(startIndex, offsetBy: bounds.lowerBound)
let end = index(start, offsetBy: bounds.count)
return self[start..<end]
}
}
Run Code Online (Sandbox Code Playgroud)
显着变化:
StringProtocol
. 这使得采用者Substring
也可以获得这些下标。String
。该index
方法的复杂度为 O(n),其中 n 是相对于 i 的偏移量。