Как подавить предупреждение «переменная никогда не использовалась», если мне нужно сохранить целевой объект в Swift? - PullRequest
0 голосов
/ 05 октября 2018

Иногда мне приходится поддерживать экземпляр класса без явной именованной ссылки на него.Например, в этом коде компилятор жалуется.

let a = AAA()
// "... `b` never used" warning.
let b = a.bbb()
a.ddd(333)

Но если я заменим b на _, то экземпляр мгновенно умирает и выдает неверный результат.

let a = AAA()
// "... `b` never used" warning.
let _ = a.bbb()
a.ddd(333)

Тот же результат без ключевого слова let.

let a = AAA()
// "... `b` never used" warning.
_ = a.bbb()
a.ddd(333)

Вот пример рабочего кода для воспроизведения ситуации.

func eee() {
    final class AAA {
        weak var ccc: AAA?
        func bbb() -> AAA {
            let r = AAA()
            ccc = r
            return r
        }
        func ddd(_ value: Int) {
            // This side effect is what I want.
            print(value)
            ccc?.ddd(value)
        }
    }

    let a = AAA()
    // "... `b` never used" warning.
    let b = a.bbb()
    a.ddd(333)
    _ = b
}

eee()

Как подавить предупреждение, сохранив экземпляр живым?

Я использую Swift 4.1, включенный в Xcode 10.0.


Edit

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

Если вы не понимаете мое намерение, извините.В коде нет намерений, кроме как показать проблему.Я переименовал все, чтобы стереть смыслы.

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

В одну сторону:

let a = Pipe1()
let b = a.extend()
a.push(333)
_ = b

В другую сторону:

let a = Pipe1()
withExtendedLifetime(a.extend()) {
    a.push(333)
}

Но я не могу понять или догадаться, что вы действительно хотите сделать со своим кодом ...

0 голосов
/ 05 октября 2018

Если честно, я не понимаю, чего вы хотите достичь с помощью класса Pipe1.

Что касается справочной проблемы, о которой вы спрашиваете, это ожидаемое поведение.

Сweak var continuation: Pipe1? вы просто держите слабую ссылку, поэтому вам нужно иметь сильную ссылку где-то еще.В вашем случае let _ = a.extend() делает это для вас.Но поскольку вы хотите избавиться от этого, вам нужно переосмыслить, где вы на самом деле хотите хранить сильную ссылку.

...