【问题标题】:Swift custom assignment to tuple对元组的 Swift 自定义分配
【发布时间】:2022-01-15 08:19:46
【问题描述】:

我有一个包含原始值和掷骰子的结构

var diceRoll: Int {
  Int.random(in: 1...6)
}

struct Score {
  var raw: Int
  let roll: Int
  
  init(_  raw: Int) {
    self.raw = raw
    self.roll = diceRoll
  }
  
  init(raw: Int, roll: Int) {
    self.roll = roll
    self.raw = raw
  }
}

还有两个玩家,所以将值保存在一个元组中

var (myScore, hisScore) = (Score(4), Score(3))

当我需要为玩家的分数添加或减去修饰符时,我使用 (Int, Int) 的元组

(1, -1)

并使用自定义运算符修改分数

func +(lhs: (Score, Score), rhs: (Int, Int)) -> (Score, Score) {
  (Score(raw: lhs.0.raw + rhs.0, roll: lhs.0.roll), Score(raw: lhs.1.raw + rhs.1, roll: lhs.1.roll))
}

而不是像这样使用加法和分配来修改分数:

(myScore, hisScore) = (myScore, hisScore) + (1, -1)

我想我可以使用这个赋值运算符

func +=(lhs: inout (Score, Score), rhs: (Int, Int)) {
  lhs = lhs + rhs
}

但是

(myScore, hisScore) += (1, -1)

给出这个错误:

二元运算符“+=”不能应用于“(Score,Score)”和“(Int,Int)”类型的操作数

我认为这与元组的分配方式有关,但有谁知道问题出在哪里,是否可以让它工作?

【问题讨论】:

    标签: swift tuples assignment-operator


    【解决方案1】:

    (myScore, hisScore) += (1, -1) 不起作用,因为(myScore, hisScore) 不是一个可变的东西。这就像在说

    (1, 2, 3) += (4, 5, 6)
    

    myScorehisScore 本身是可变的,但模式匹配仅适用于 = 的左侧,而不是 +=

    如果您将元组放入单个变量中:

    var scores = (Score(4), Score(3))
    

    那么你可以这样做:

    scores += (1, 2)
    

    为了可以使用myScoretheirScore 访问分数,您可以向元组添加参数标签:

    typealias Scores = (myScore: Score, theirScore: Score)
    var scores: Scores = (Score(4), Score(3))
    
    // you would also need to change the parameter type:
    func +=(lhs: inout Scores, rhs: (Int, Int)) {
        lhs = lhs + rhs
    }
    

    如果您不打算在元组上进行太多模式匹配,也可以考虑将其更改为 struct

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-02-23
      • 2023-03-12
      • 2018-12-08
      • 2019-12-13
      • 2020-12-14
      • 2019-07-28
      • 2018-03-03
      相关资源
      最近更新 更多