#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 гарантирует, что это будет согласовано.