Глобальная функция вызывает метод мутации типа протокола.Как мне избавиться от объекта var tmp? - PullRequest
0 голосов
/ 13 декабря 2018

это мой рабочий фрагмент кода.Но я хочу избавиться от переменной var tmp в функции slide .

protocol Moveable {
    mutating func move(to point: CGPoint)
}

class Car : Moveable {
    var point:CGPoint = CGPoint(x: 23, y: 42)
    func move(to point: CGPoint) {
        self.point = point
        print("Method move from class Car Point: \(point)")
    }
}

struct Shape : Moveable {
    var point:CGPoint = CGPoint(x: 23, y: 42)
    mutating func move(to point: CGPoint) {
       self.point = point
       print("Method move from struct Shape Point:\(point)")
    }
}

var prius: Car = Car()
var square: Shape = Shape()

func slide(slider: Moveable) {
    var tmp = slider  // <---- I want get rid of the tmp object.(
    tmp.move(to: CGPoint(x: 100, y: 100))
}

slide(slider: prius)
slide(slider: square)

Я пробовал что-то подобное, чтобы избежать var tmp:

func slide(slider: inout Moveable) {
    slider.move(to: CGPoint(x: 100, y: 100))
}

slider(slider: prius) // <--- Compile Error
// Cannot use mutating member on immutable value: 'slider' is a 'let' constant
slider(slider: prius as (inout Moveable) // <--- Compile Error

Спасибо.

1 Ответ

0 голосов
/ 13 декабря 2018

Это может работать с этим небольшим изменением:

func slide<M: Moveable>(slider: inout M) {
    slider.move(to: CGPoint(x: 100, y: 100))
}

Вместо запроса Movable мы запрашиваем тип, соответствующий Movable.

И называем это так:

slide(slider: &prius)
slide(slider: &square)
...