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

时间:2016-11-11 11:40:42

标签: ios swift swift3 immutability 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)
    }

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

2 个答案:

答案 0 :(得分: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,然后呢?您可以使它更具体但更具体,并使用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内编写有意义的代码。

答案 1 :(得分:1)

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

除此之外,请听appzYourLife。