2

我想知道是否有可能在我的视图控制器中使用惰性属性,并在deinit方法中调用我的惰性属性的方法,前提是它已被初始化。下面是一些代码:

fileprivate lazy var session: MySession = {
    let session: MySession = MySession()
    session.delegate = self
    return session
}()

deinit {
    session.delete()
}

这样,当session.delete()indeinit方法被调用并且session没有被使用时(仍然如此nil),它被初始化然后delete被调用。我不想要这个。我delete只想session在之前初始化的情况下打电话。

有没有办法做到这一点?我要放弃懒惰的初始化想法吗?

4

1 回答 1

5

您可以使用私有变量来跟踪会话是否已创建。我认为这个示例可以满足您的要求(来自操场的代码):

class Thing {
    private var hasMadeSession: Bool = false
    lazy fileprivate var session: Int = {
        self.hasMadeSession = true
        return 1
    }()

    deinit {
        print(#function)
        if self.hasMadeSession {
            print("Hello")
        }
    }
}

var thing: Thing? = Thing()
thing = nil // Prints "deinit"
thing = Thing()
thing?.something
thing = nil // Prints "deinit" and "Hello"
于 2017-05-30T10:22:16.497 回答