如何创建一个确认某个协议并具有不同父类的对象数组?

时间:2015-09-14 02:03:56

标签: ios swift

我有一个与设计相关的问题。

有一个继承自CAShapeLayer的类,另一个继承自CATextLayer的类,它们都确认了某个协议,如下所示。

React.render(
    <CommentBox url="data/comments.json" pollInterval={2000} />,
    document.getElementById('class')
);

UIView的子类有一组确认此协议的对象:

protocol HogeProtocol {
    func aFunction()
}

class A: CAShapeLayer, HogeProtocol {
    func aFunction() {
        print("I am Class A")
    }
}

class B: CATextLayer, HogeProtocol {
    func aFunction() {
        print("I am Class B")
    }
}

我在这里要做的是调用customLayers的aFunction()并将它们添加到这个自定义UIView的层。

class CustomView: UIView {
    var customLayers = [HogeProtocol]()
    func callTheFunctionAndAddSublayer() {
        // some implementation
    }
}

在这种情况下,元素是确认协议但不能添加到子图层,因为它们不是从CALayer继承的。我希望我可以创建一个从CALayer继承的对象数组(这是CAShapeLayer和CATextLayer的常见父类)并确认协议,但swift不允许我这样做(据我所知)。 。)

这似乎是一个非常简单的问题,并且猜测可能已经有了一个解决方案但是在谷歌研究后几小时我找不到任何答案...... 有什么想法吗?

3 个答案:

答案 0 :(得分:0)

您需要使用as?as!将数组对象向下转换为CALayer。

答案 1 :(得分:0)

试试这个:

for customLayer in customLayers {
    customLayer.aFunction()
    layer.addSublayer(customLayer as! CALayer) // would crash if customLayer is not of CALayer
}

答案 2 :(得分:0)

您可以将对象强制转换为CALayer,并检查它是否真的是一种CALayer。

class CustomView: UIView
{
    var customLayers = [CALayer]()

    func callTheFunctionAndAddSublayer()
    {
        for customLayer in customLayers
        {
            customLayer.aFunction() // can call

            if let layer = customLayer as? CALayer where layer.isKindOfClass(CALayer)
            {
                layer.addSublayer(layer) 
            }
        }
    }
}