0

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

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)
    }

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

4

2 回答 2

2

因为 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然后呢?你可以让它更具体一点,并使用 aUIView作为参数

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.

于 2016-11-11T11:52:44.173 回答
1

inout 适用于您要更改引用的情况,即将一个对象替换为另一个对象。这对 IBOutlet 来说是一件非常、非常、非常糟糕的事情。该按钮用于视图,连接了很多东西,如果你改变变量,所有的地狱都会崩溃。

除此之外,请听 appzYourLife。

于 2016-11-11T12:32:53.257 回答