AssociatedObject icon indicating copy to clipboard operation
AssociatedObject copied to clipboard

Any idea why this is error.

Open mlch911 opened this issue 2 years ago • 2 comments

This code get an error: Value of type '(UIView) -> () -> UIView' has no member 'window'

@AssociatedObject(.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
private var autoMaskView: UIView = {
    let view = UIView()
    view.bk_(whenTapped: { [weak self] in
        self?.window?.endEditing(true)
    })
    return view
}()

But after I replace the code with the macro expaned code, the error goes away.🤣

static var __associated_autoMaskViewKey: UInt8 = 0
private var autoMaskView: UIView
{
    get {
        if let value = objc_getAssociatedObject(
            self,
            &Self.__associated_autoMaskViewKey
        ) as? UIView {
            return value
        }
        let value = {
            let view = UIView()
            view.bk_(whenTapped: { [weak self] in
                self?.window?.endEditing(true)
            })
            return view
        }()
        objc_setAssociatedObject(
            self,
            &Self.__associated_autoMaskViewKey,
            value,
            .OBJC_ASSOCIATION_RETAIN_NONATOMIC
        )
        return value
    }
    set {
        objc_setAssociatedObject(
            self,
            &Self.__associated_autoMaskViewKey,
            newValue,
            .OBJC_ASSOCIATION_RETAIN_NONATOMIC
        )
    }
}

mlch911 avatar Jan 16 '24 08:01 mlch911

Regardless of Macro, it should not be possible to capture self before Self is initialized.

How about modifying it to assign after initialization as follows?

import UIKit

extension UIView {
    func bk_(whenTapped: () -> Void) {}
}

extension UIViewController {
    @AssociatedObject(.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
    private var autoMaskView: UIView?

    func setup() {
        autoMaskView = { [self] in
            let ss = self
            let view = NSView()
            view.bk_(whenTapped: { [weak ss] in
                self?.window?.endEditing(true)
            })
            return view
        }()
    }
}

p-x9 avatar Jan 16 '24 08:01 p-x9

So the Macro is build before Self is initialized. It's different from just using a computing property, right?

So if I want to capture self, I can't use @AssociatedObject.

mlch911 avatar Mar 28 '24 06:03 mlch911