Swift - 演员[AnyObject]!到[协议]!直

时间:2016-01-20 08:28:46

标签: swift casting interface-builder iboutletcollection

我正在尝试克服here解释的限制,因为我无法将IB elements直接连接到protocol types的商店。

提到的解决方法并不理想,因为我需要一个Outlet Collection并连接一个新元素意味着一次又一次地重做这个,这就违背了我项目这一部分的目的。

所以我想我会创建一个中间控制器,其唯一目的是将AnyObject插座集合轻松转换为使用Protocol键入的数组。

我发现您在下面看到的数组转换会引发错误:“Type FormField”不符合协议“AnyObject

但是,简单的每项循环注释实际上有效。

我想理解为什么前者失败了,如果有办法真正避免每个项目循环。

class FormViewController: UIViewController, Form {

    @IBOutlet var fieldCollection: [AnyObject]!

    var formFields: [FormField]!

    override func viewDidLoad() {
        super.viewDidLoad()

        self.formFields = self.fieldCollection as! [FormField]!
        /*
            self.formFields = [FormField]()
            for field in self.fieldCollection {
            self.formFields.append(field as! FormField)
        }*/
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

1 个答案:

答案 0 :(得分:0)

您没有说明如何定义FormField协议,但我猜测它没有将AnyObject类作为约束。

例如:protocol FormField:class,AnyObject {}

如果确实如此,那么类型转换就可以了。

然后您可以将其声明为:

class FormViewController: UIViewController, Form {

    @IBOutlet var fieldCollection: [AnyObject]!
    var formFields: [FormField] { return fieldCollection as! [FormField] }

我相信你可以这样做(在Swift 2.1中):

    @IBOutlet var fieldCollection: [FormField]!