【问题标题】:Overriding CALayer's initWithLayer in Swift在 Swift 中覆盖 CALayer 的 initWithLayer
【发布时间】:2014-09-23 15:31:16
【问题描述】:

我正在学习如何使用 CALayers 并在其属性上执行动画。对于初学者来说,Apple 的文档简直是晦涩难懂。我设法在 iOS 的文档中找到了一个示例(称为:CustomAnimatableProperty),它有点“解释”如何做我想做的事:

// For CALayer subclasses, always support initWithLayer: by copying over custom properties.
-(id)initWithLayer:(id)layer {
    if( ( self = [super initWithLayer:layer] ) ) {
        if ([layer isKindOfClass:[BulbLayer class]]) {
            self.brightness = ((BulbLayer*)layer).brightness;
        }
    }
    return self;
}

将方法覆盖转换为 Swift 但是给了我一些错误:

这些错误源于我对这里发生的事情缺乏了解。我不确定我们在那些嵌套的 if 语句中检查什么。此外,我对在主 if(){} 块中使用“=”感到有些困惑。我们不应该检查 ("==") 是否相等吗?

但是,是的,任何一般性的帮助都意味着世界。我尝试过在线查看一些博客文章/教程,但没有一个涉及这个特定问题。

【问题讨论】:

    标签: ios objective-c swift calayer


    【解决方案1】:

    self = [super init...] 成语适用于 Objective-C,而不是 Swift。在 Swift 中,init 块不是普通函数,不会返回任何内容。

    在此过程中,让我们使用 Swift 成语进行向下转换。我们还需要保证size在我们调用super.init之前被初始化。

    override init(layer: AnyObject!) {
        if let layer = layer as? SegmentActiveLayer {
            size = layer.size
        } else {
            size = 0
        }
        super.init(layer: layer)
    }
    

    【讨论】:

      猜你喜欢
      • 2013-03-29
      • 1970-01-01
      • 1970-01-01
      • 2015-07-10
      • 1970-01-01
      • 2018-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多