Definición de protocolos
Parte de la sección Programación orientada a objetos del Journey de Swift de Coddy. Lección 27 de 57.
Un protocolo enumera requisitos (métodos y propiedades) sin implementarlos. Un tipo cumple el protocolo al proporcionar todos los requisitos, y después puede usarse allí donde se espere el protocolo:
protocol Describable {
func describe() -> String
}
struct Book: Describable {
let title: String
func describe() -> String { "Book: \(title)" }
}
print(Book(title: "Dune").describe())Salida:
Book: DuneA diferencia de la herencia, un protocolo funciona por igual para estructuras, clases y enumeraciones, y un tipo puede ajustarse a muchos protocolos. El protocolo solo indica qué puede hacer un tipo; cada tipo decide cómo:
protocol Describable {
func describe() -> String
}
struct Point: Describable {
var x = 0, y = 0
func describe() -> String { "(\(x), \(y))" }
}
enum Level: Describable {
case low, high
func describe() -> String { self == .low ? "low" : "high" }
}
print(Point(x: 1, y: 2).describe())
print(Level.high.describe())Salida:
(1, 2)
highLos requisitos de propiedades indican el tipo y si la propiedad es de solo lectura ({ get }) o también se puede escribir en ella ({ get set }). Un requisito { get } puede cumplirse mediante una propiedad almacenada o calculada:
protocol Named {
var name: String { get }
}
struct User: Named {
let name: String
}
struct Planet: Named {
var number: Int
var name: String { "Planet \(number)" }
}
print(User(name: "ada").name)
print(Planet(number: 3).name)Salida:
ada
Planet 3Si un tipo afirma cumplir con un protocolo, pero no cumple un requisito, no se compila. El compilador comprueba cada conformidad, por lo que el código que usa el protocolo puede confiar en él:
protocol Priced {
var price: Int { get }
func discounted(by percent: Int) -> Int
}
// struct Ticket: Priced { var price = 10 }
// error: el tipo 'Ticket' no se ajusta al protocolo 'Priced'Desafío
FácilDeclara un protocolo Shape con una propiedad de solo lectura name (String) y un método area() que devuelva Double. Haz que las estructuras Rectangle (width, height) y Circle (radius, usando 3.0 para π para mantener los números simples) se ajusten a él, con los nombres rectangle y circle.
El código proporcionado lee líneas r,3,4 o c,2, crea la forma correspondiente e imprime rectangle: 12.0.
Tu código va en Shape.swift, Rectangle.swift y Circle.swift. main.swift contiene el código proporcionado de entrada/salida y no se puede editar.
Pruébalo tú mismo
// Código de entrada/salida suministrado: déjalo como está
var input: [String] = []
while let line = readLine() { input.append(line) }
for line in input {
let p = line.split(separator: ",").map(String.init)
if p[0] == "r" {
let s = Rectangle(width: Double(p[1])!, height: Double(p[2])!)
print("\(s.name): \(s.area())")
} else {
let s = Circle(radius: Double(p[1])!)
print("\(s.name): \(s.area())")
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Programación orientada a objetos
1Clases y objetos
Trabajar con archivosDefinir clasesMétodos y selfInicializadoresLas clases son referenciasRepaso: tarjeta de biblioteca4Encapsulación
Control de accesoSolo lectura desde fueraProtección del estadoInicializadores que pueden fallarRepaso - Cuenta bancaria7Polimorfismo y genéricos
PolimorfismoConversión de tiposFunciones genéricasTipos genéricosRepaso - Calculadora de formas2Structs y tipos por valor
StructsSemántica de valoresMétodos mutablesStruct o claseRepaso - elemento del inventario5Herencia
SubclasesSobrescritura de métodosInicializadores y superfinal y jerarquíasRepaso: jerarquía de empleados8Protocolos estándar
CustomStringConvertibleEquatableComparableHashableRepaso - Ordenamiento personalizado11Proyecto: Gestión de bibliotecas
Libros y miembrosPréstamo de libros3Propiedades en profundidad
Propiedades calculadasObservadores de propiedadesMiembros estáticosEnumeraciones con métodosRepaso - Registro de temperatura6Protocolos
Definición de protocolosTipos conformesExtensiones de protocolosProtocolos como tiposRepaso: sistema de pagosPractica por tu cuenta: Playground de Swift