Как переопределить layerClass в swift

#swift

#swift

Вопрос:

В Objective-C мы используем для этого следующее

   (Class)layerClass
{
    return [CAEAGLLayer class];
}
 

Очевидно, что это не сработает:

 CAEAGLLayer.class()
 

Потому class что это ключевое слово в Swift. Как вы это делаете в Swift?

Ответ №1:

Адаптировано из примера кода Apple ListerKit:

 override class func layerClass() -> AnyClass {
    return CAEAGLLayer.self
}
 

Обновление для Swift 3:

 override class var layerClass: AnyClass {
    get {
        return CAGradientLayer.self
    }
}
 

Комментарии:

1. Более короткая версия: override class var layerClass: AnyClass { CAGradientLayer.self }

Ответ №2:

В iOS 10 это вычисляемое свойство, а не метод:

 override class var layerClass: AnyClass {
    get {
        return CAEAGLLayer.self
    }
}
 

Комментарии:

1. Работает в Swift 3, но мне пришлось объявить его открытым , т.е. override open class var layerClass: AnyClass

Ответ №3:

Swift выполняет самоанализ совсем не так, как Objective-C. Возможно, вы захотите взглянуть на документы о метатипах.

Для вашего случая я бы попробовал: CAEAGLLayer.self

Комментарии:

1. В данном случае это правильный ответ, потому layerClass что объявляется как возвращаемый AnyClass! , который является типом для типов. Но в целом они не совпадают, поскольку тип не является объектом, тогда как классы в Objective-C являются объектами.

2. Я этого не понимаю. Я не хочу читать информацию о классе слоя. Я хочу переопределить тип слоя UIView по умолчанию. Это должно быть сделано до того, как экземпляр UIView будет выделен, а не после. Метод, который я вставил выше, использовался для этого в ObjC, но я не понимаю, как реализовать его в Swift?

3. Это то, что обходной путь, который работает, но это не одно и то же var gradientLayer:CAGradientLayer = CAGradientLayer() layer.insertSublayer(gradientLayer, atIndex: 0)

Ответ №4:

Это можно записать так

 import UIKit

class GradientView: UIView {

    override final class var layerClass: AnyClass {
        return CAGradientLayer.self
    }
}
 

Бонусный совет: может быть, вы хотели бы иметь типобезопасный геттер для слоя? Затем вы можете написать

 import UIKit

class GradientView: UIView {

    override final class var layerClass: AnyClass {
        return CAGradientLayer.self
    }

    override var layer: CAGradientLayer {
        return super.layer as! CAGradientLayer
    }

}
 

Комментарии:

1. Причина, по которой я использую bang ! , заключается в том, что objective-c гарантирует, что это будет согласовано.