Menu
Coddy logo textTech

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: Dune

A 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)
high

Los 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 3

Si 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'
challenge icon

Desafío

Fácil

Declara 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())")
    }
}
quiz iconPonte a prueba

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

Practica por tu cuenta: Playground de Swift