无法通过下标分配给 Swift 字符串
Cannot assign through subscript to Swift String
我有一个 class,其中包含名称、图像、名称的虚线形式和名称的长度。例如,我可以有 "dog"、一张狗的图像、“---”和名称长度 3.
我只想为每个对象设置名称和图片,并自动设置 dashName
和 nameLength
。
class Answer {
var name = "name"
var image: UIImage?
var dashName = "name"
var nameLength = 0
init(){
var a = 0
nameLength = name.characters.count
while a <= nameLength {
if (name[a] == " ") {dashName[a] = " "}
else {dashName[a] = "-"}
a += 1
}
}
}
问题是错误提示:"cannot assign through subscript: subscript is get-only" 和另一个错误提示:"subscript is unavailable: cannot subscript String with an Int"
编辑:反转
class Answer {
var name = "name"
var image: UIImage?
var dashName = "name"
var nameLength = 0
init(){
dashName = String(name.map {[=10=] == " " ? " " : "-"})
}
}
String
的下标运算符是只读的,这意味着您只能使用它从字符串中读取,并且必须使用其他东西来写入可变字符串。
您可以解决此问题,并通过在 name
上使用 map
函数来清理代码
Swift 4
class Answer {
var name = "name"
var image: UIImage?
var dashName = "name"
var nameLength = 0
init()
{
nameLength = name.count
dashName = name.map { [=10=] == " " ? " " : "-" }.joined()
}
}
Swift 3
class Answer {
var name = "name"
var image: UIImage?
var dashName = "name"
var nameLength = 0
init()
{
nameLength = name.characters.count
dashName = name.characters.map { [=11=] == " " ? String(" ") : String("-") }.joined()
}
}
和之前的mentioned一样,
Swift 的 String
class 是其他语言所说的 StringBuilder
class,出于性能原因,Swift 是 NOT 提供索引设置字符;如果您不关心性能,一个简单的解决方案可能是:
public static func replace(_ string: String, at index: Int, with value: String) {
let start = string.index(string.startIndex, offsetBy: index)
let end = string.index(start, offsetBy: 1)
string.replaceSubrange(start..<end, with: value)
}
或作为扩展:
extension String {
public func charAt(_ index: Int) -> Character {
return self[self.index(self.startIndex, offsetBy: index)];
}
public mutating func setCharAt(_ index: Int, _ new: Character) {
self.setCharAt(index, String(new))
}
public mutating func setCharAt(_ index: Int, _ new: String) {
let i = self.index(self.startIndex, offsetBy: index)
self.replaceSubrange(i...i, with: new)
}
}
Note how above needs to call index(...)
method to convert integer to actual-index!? It seems, Swift implements String
like a linked-list, where append(...)
is really fast, but even finding the index (without doing anything with it) is a linear-time operation (and gets slower based on concatenation count).
我有一个 class,其中包含名称、图像、名称的虚线形式和名称的长度。例如,我可以有 "dog"、一张狗的图像、“---”和名称长度 3.
我只想为每个对象设置名称和图片,并自动设置 dashName
和 nameLength
。
class Answer {
var name = "name"
var image: UIImage?
var dashName = "name"
var nameLength = 0
init(){
var a = 0
nameLength = name.characters.count
while a <= nameLength {
if (name[a] == " ") {dashName[a] = " "}
else {dashName[a] = "-"}
a += 1
}
}
}
问题是错误提示:"cannot assign through subscript: subscript is get-only" 和另一个错误提示:"subscript is unavailable: cannot subscript String with an Int"
编辑:反转
class Answer {
var name = "name"
var image: UIImage?
var dashName = "name"
var nameLength = 0
init(){
dashName = String(name.map {[=10=] == " " ? " " : "-"})
}
}
String
的下标运算符是只读的,这意味着您只能使用它从字符串中读取,并且必须使用其他东西来写入可变字符串。
您可以解决此问题,并通过在 name
map
函数来清理代码
Swift 4
class Answer {
var name = "name"
var image: UIImage?
var dashName = "name"
var nameLength = 0
init()
{
nameLength = name.count
dashName = name.map { [=10=] == " " ? " " : "-" }.joined()
}
}
Swift 3
class Answer {
var name = "name"
var image: UIImage?
var dashName = "name"
var nameLength = 0
init()
{
nameLength = name.characters.count
dashName = name.characters.map { [=11=] == " " ? String(" ") : String("-") }.joined()
}
}
和之前的mentioned一样,
Swift 的 String
class 是其他语言所说的 StringBuilder
class,出于性能原因,Swift 是 NOT 提供索引设置字符;如果您不关心性能,一个简单的解决方案可能是:
public static func replace(_ string: String, at index: Int, with value: String) {
let start = string.index(string.startIndex, offsetBy: index)
let end = string.index(start, offsetBy: 1)
string.replaceSubrange(start..<end, with: value)
}
或作为扩展:
extension String {
public func charAt(_ index: Int) -> Character {
return self[self.index(self.startIndex, offsetBy: index)];
}
public mutating func setCharAt(_ index: Int, _ new: Character) {
self.setCharAt(index, String(new))
}
public mutating func setCharAt(_ index: Int, _ new: String) {
let i = self.index(self.startIndex, offsetBy: index)
self.replaceSubrange(i...i, with: new)
}
}
Note how above needs to call
index(...)
method to convert integer to actual-index!? It seems, Swift implementsString
like a linked-list, whereappend(...)
is really fast, but even finding the index (without doing anything with it) is a linear-time operation (and gets slower based on concatenation count).