Protocols: Warum ist @ObjC für die Konformitätsprüfung und optionale Anforderungen erforderlich?

Das Swift Doku, Erwähnung sagt folgendes über protocols:

Sie können die Protokollkonformität nur überprüfen, wenn Ihr Protokoll mit dem Attribut @objc gekennzeichnet ist, wie dies für das HasArea-Protokoll oben dargestellt ist. Dieses Attribut gibt an, dass das Protokoll für Objective-C-Code verfügbar gemacht werden soll. Eine Beschreibung finden Sie unter Verwenden von Swift mit Cocoa und Objective-C. Auch wenn Sie nicht mit Objective-C zusammenarbeiten, müssen Sie Ihre Protokolle mit dem Attribut @objc kennzeichnen, um die Protokollkonformität überprüfen zu können.

Beachten Sie auch, dass @objc-Protokolle nur von Klassen und nicht von Strukturen oder Aufzählungen übernommen werden können. Wenn Sie Ihr Protokoll als @objc markieren, um die Konformität zu überprüfen, können Sie dieses Protokoll nur auf Klassentypen anwenden.

un

Optional Protokollanforderungen können nur angegeben werden, wenn Ihr Protokoll mit dem Attribut @objc gekennzeichnet ist. Auch wenn Sie nicht mit Objective-C zusammenarbeiten, müssen Sie Ihre Protokolle mit dem Attribut @objc kennzeichnen, wenn Sie optionale Anforderungen angeben möchten.

Beachten Sie auch, dass @objc-Protokolle nur von Klassen und nicht von Strukturen oder Aufzählungen übernommen werden können. Wenn Sie Ihr Protokoll als @objc markieren, um optionale Anforderungen festzulegen, können Sie dieses Protokoll nur auf Klassentypen anwenden.

Warum kann nichtpure Swift Protokolle (non-@objc) auf Übereinstimmung geprüft werden. Warum haben sie keine optionalen Anforderungen? Kann jemand den zugrunde liegenden Grund für die Sprachgestaltung erraten?

Ich erwarte, dass Apple zu einem unbestimmten (wahrscheinlich weit entfernten) Zeitpunkt in der Zukunft langsam neu implementiert und ersetztKaka und CocoaTouch mit rein in Swift programmierten Bibliotheken. Sollten wir zu diesem Zeitpunkt die Verwendung von optionalen Protokollanforderungen und die Konformität mit den Protokollprüfungen in unserem Code vermeiden, wenn wir die Verwendung von mit Obj-C zusammenhängendem Material nicht vermeiden möchten?

Wenn ja, wie kann Swift auf idiomatische Weise ähnliche Muster erzielen, ohne @ zu verwende@objc? (Zum Beispiel ein Delegat mit optionalen Methoden.)

Zum Beispiel kann dieser einfache Anwendungsfall nicht mit non- @ implementiert werde@objc Protokolle (undPrintable, DebugPrintable undStreamable sind nicht-@objc:

import UIKit

let firstName = "John"
let lastName = "Appleseed"
let age = 33
let height = 1.74

let values: [Any] = [firstName, lastName, age, height]
let stringifiedValues = [String]()

for value in values
{
    if let pritanbleValue = value as? Printable
    {
        stringifiedValues.append(value.description)
    }
    else if let debugPrintableValue = value as? DebugPrintable
    {
        stringifiedValues.append(value.debugDescription)
    }
    else if let streamableValue = value as? Streamable
    {
        var string = ""
        streamableValue.writeTo(&string)
        stringifiedValues.append(string)
    }
    // etc.    
    else 
    {
        stringifiedValues.append("[NoStringRepresentation]")
    }
}

Antworten auf die Frage(2)

Ihre Antwort auf die Frage