无法将类型 'NSObject' 的不可变值作为 inout 参数传递



这应该工作,但我不知道为什么它不。代码是不言自明的。

class Themer {
   class func applyTheme(_ object: inout NSObject) {
      //do theming
   }
}

和我应用主题按钮,像这样:

class ViewController: UIViewController {
    @IBOutlet weak var button: UIButton!
    override func viewDidLoad() {
        super.viewDidLoad()
        Themer.applyTheme(&button)
    }

button对象是一个变量,但是编译器会抛出一个错误

因为button是一个对象,所以这个语法

Themer.applyTheme(&button)

表示要更改对该对象的引用。但这不是你想要的。如果要更改引用的对象,只需写入

Themer.applyTheme(button)

最后你也不需要inout注释

class Themer {
    class func applyTheme(_ object: AnyObject) {
        //do theming
    }
}
class ViewController: UIViewController {
    @IBOutlet weak var button: UIButton!
    override func viewDidLoad() {
        super.viewDidLoad()
        Themer.applyTheme(self.button)
    }
}

但是…

但是,您的applyTheme方法应该做什么?它接收到AnyObject,然后呢?您可以使它更具体一些,并使用UIView作为参数

class Themer {
    class func applyTheme(view: UIView) {
        //do theming
    }
}
class ViewController: UIViewController {
    @IBOutlet weak var button: UIButton!
    override func viewDidLoad() {
        super.viewDidLoad()
        Themer.applyTheme(view: button)
    }
}

现在您有机会在Themer.applyTheme中编写有意义的代码。

inout用于想要更改引用的情况,即用另一个对象替换一个对象。这对于IBOutlet来说是非常非常糟糕的事情。这个按钮在视图中使用,连接到很多东西,如果你改变这个变量,一切都会崩溃。

除此之外,请收听appzYourLife。

相关内容

最新更新