【问题标题】:Cannot assign through subscript to Swift String无法通过下标分配给 Swift String
【发布时间】:2018-05-06 04:23:43
【问题描述】:

我有一个包含名称、图像、名称的虚线形式和名称长度的类。例如,我可以有“狗”、狗的图像、“---”和名称长度 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
        }
    }
}

问题是错误提示:“无法通过下标分配:下标是 get-only”和另一个错误提示:“下标不可用:无法使用 Int 下标字符串”

【问题讨论】:

    标签: swift string subscript


    【解决方案1】:

    就像之前的mentioned, Swift 的 String 类是其他语言所称的 StringBuilder 类,出于性能原因,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)
        }
    }
    

    注意上面如何需要调用index(...)方法将整数转换为实际索引!?看来,Swift 实现 String 就像一个链表,其中 append(...) 非常快,但即使找到索引(不做任何事情)也是一个 linear-time 操作(并且得到根据连接数变慢)。

    【讨论】:

      【解决方案2】:

      编辑:倒置

      class Answer {
          var name = "name"
          var image: UIImage?
          var dashName = "name"
          var nameLength = 0
      
          init(){
              dashName = String(name.map {$0 == " " ? " " : "-"})
          }
      }
      

      【讨论】:

      • 空格应单独保留,任何其他字符应替换为“-
      【解决方案3】:

      String 的下标运算符是 get-only,这意味着您只能使用它从字符串中读取,并且必须使用其他东西来写入可变字符串。

      您可以解决这个问题,并通过在name 上使用map 函数来清理代码

      斯威夫特 4

      class Answer {
          var name = "name"
          var image: UIImage?
          var dashName = "name"
          var nameLength = 0
      
          init()
          {
              nameLength = name.count
              dashName = name.map { $0 == " " ? " " : "-" }.joined()
          }
      }
      

      斯威夫特 3

      class Answer {
          var name = "name"
          var image: UIImage?
          var dashName = "name"
          var nameLength = 0
      
          init()
          {
              nameLength = name.characters.count
              dashName = name.characters.map { $0 == " " ? String(" ") : String("-") }.joined()
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多