Передача класса по значению - PullRequest
0 голосов
/ 18 февраля 2019

Я новичок в Swift, поэтому, пожалуйста, дайте мне знать, если я пропустил что-то болезненное очевидное.У меня есть class, который я хочу передать по значению для перегрузки оператора +.

Код не будет работать, если я определю левый аргумент lhs как foo, но тогда этонеизменяемый, и будет работать, если lhs равен inout foo, но тогда я изменил lhs, что мне явно не нужно.

Быстрый анализ моего класса:

class foo<T: Numeric> {
    /* Data */
    /* Init Fn */
    /* += definition */
    static func + (lhs: foo, rhs: foo) -> foo {
        do {
            try lhs += rhs
            return lhs
        } catch {
            /* Error Handling */
        }
    }
}

Я пришел из C ++, поэтому я удивлен, что не могу передать объект по значению, если я выберу.После вопроса Каковы основные правила и идиомы для перегрузки операторов? , в C ++ этот метод перегрузки будет ожидать, что левый аргумент будет передаваться по значению, а правый аргумент будет передаваться const &, как показано ниже, но здесь у меня, кажется, нет этой опции.

class X {
    /* In Swift operators are not defined internally like this */
    X& operator+=(const X& rhs) {
        // actual addition of rhs to *this
        return *this;
    }
};
inline X operator+(X lhs, const X& rhs) {
    lhs += rhs;
    return lhs;
}

Есть ли способ, о котором я не знаю, или перегрузка выполняется по-другому в Swift?

Любая помощьбудет принята с благодарностью.

1 Ответ

0 голосов
/ 18 февраля 2019

Я не вижу реальной проблемы с изменчивостью.Обратите внимание, что в классах без передачи по значению вы просто не можете использовать один оператор для определения другого.

class Foo<T: Numeric> {
    var value: T

    init(value: T) {
        self.value = value
    }

    static func + (lhs: Foo, rhs: Foo) -> Foo {
        return Foo(value: lhs.value + rhs.value)
    }

    static func += (lhs: Foo, rhs: Foo) {
        lhs.value += rhs.value
    }
}

let ten = Foo<Int>(value: 10)
let eighteen = ten + Foo<Int>(value: 8)
eighteen += Foo<Int>(value: 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...