que protocolos programacion orientada inicializadores estructura datos computadas clases ios swift swift2 protocols conform

ios - programacion - Protocolos de solo clase en Swift



que es self en swift (4)

¡La última versión de Swift puede hacerlo! ¡Haría un protocolo y extensiones de protocolo que apuntan a las clases que quieres! (restringir la extensión a una clase específica)

protocol Movable { func moveForward() func moveBackward() } extension Movable where Self: Car { func moveForward() { self.location.x += 10; } func moveBackward() { self.location.x -= 10; } } extension Movable where Self: Bike { func moveForward() { self.x += 1; } func moveBackward() { self.x -= 1; } } class Car: Movable { var location: CGPoint init(atLocation location: CGPoint) { self.location = location } } class Bike: Movable { var x: Int init(atX x: Int) { self.x = x } }

Quiero que algunas de mis clases (no todas) se ajusten al uso de ''Protocolos de solo clase'' de los documentos. Lo que estoy haciendo es

protocol RefreshData: class, ClassA, ClassB { func updateController() }

y estoy recibiendo los errores

non class type ''RefreshData cannot inherit from classA non class type ''RefreshData cannot inherit from classB

No estoy seguro de estar siguiendo exactamente como en los documentos. ¿Alguien tiene alguna idea acerca de esto?


Las respuestas proporcionadas por Chris y Wain son correctas. Solo estoy agregando algunos detalles más aquí.

Definiendo un protocolo

Debe distinguir el concepto de declarar un protocol (disponible para las clases)

protocol RefreshData: class { func updateController() }

Definiendo una clase

... desde el concepto de conformar tu clase a un protocolo

class ClassA: RefreshData { func updateController() { } }

Conformando una clase que no tienes

A veces desea conformar una clase a un protocolo, pero no posee el código fuente de esa clase. En este caso puedes usar una extension

extension ClassB: RefreshData { func updateController() { } }


Swift 4 le permite combinar tipos, para que pueda tener su protocolo y luego crear, por ejemplo, un alias de tipo para combinarlo con un requisito de clase específico.

Por ejemplo:

typealias PresentableVC = UIViewController & Presentable

Para el código presentado:

El problema es que estás tratando de limitarte a clases específicas y Swift no puede hacer eso (al menos en este momento). Solo se puede limitar a clases y heredar de otros protocolos. Su sintaxis es para la herencia del protocolo, pero está intentando usarla como una limitación de clase.

Tenga en cuenta que el propósito de los protocolos de clase es:

Utilice un protocolo solo de clase cuando el comportamiento definido por los requisitos de ese protocolo supone o requiere que un tipo conforme tenga una semántica de referencia en lugar de una semántica de valor.


protocol RefreshData : class { func updateController() } class ClassA : RefreshData { func updateController() {} } class ClassB : RefreshData { func updateController() {} }