0

我试图克服这里解释的关于无法直接连接IB elements到插座的限制protocol types

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

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

我发现您在下面看到的数组转换会引发错误:“类型' 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.
    }
}
4

1 回答 1

0

您没有展示 FormField 协议是如何定义的,但我猜它没有 AnyObject 类作为约束。

例如:协议 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]!
于 2016-01-21T04:43:52.710 回答