无法通过下标分配给 Swift 字符串

Cannot assign through subscript to Swift String

我有一个 class,其中包含名称、图像、名称的虚线形式和名称的长度。例如,我可以有 "dog"、一张狗的图像、“---”和名称长度 3.

我只想为每个对象设置名称和图片,并自动设置 dashNamenameLength

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).