Übergeben Sie ein Array protokollkonformer Objekte an die Funktion

Aug 28 2020

Ich möchte eine Funktion schreiben, die ein Array von Objekten akzeptiert, die einem bestimmten Protokoll entsprechen. Ich habe den folgenden Spielplatzcode geschrieben:

protocol Request {}

struct RequestA: Request {}
struct RequestB: Request {}

func execute<T: Request>(requests: [T]) {}

let requests: [Request] = [RequestA(), RequestB()]

execute(requests: requests)

In der letzten Zeile erhalte ich jedoch die folgende Fehlermeldung: "Der Wert des Protokolltyps 'Request' kann nicht mit 'Request' übereinstimmen; nur die Typen struct / enum / class können mit den Protokollen übereinstimmen."

Ich glaube, dass dieser Fehler auftritt, weil die Funktion ein Array von Objekten erwartet, die dem Protokoll entsprechen, nicht ein Array der Protokolle, aber ich weiß nicht, wie ich das anders machen soll.

Kann jemand helfen, das zu klären?

Danke im Voraus!

Antworten

1 bscothern Aug 28 2020 at 05:12

Wie andere gesagt haben, möchten Sie func execute(requests: [Request]) {}in diesem Fall haben.

Der Grund dafür ist, dass Sie func execute<T: Request>(requests: [T]) {}als generische Funktion einen konkreten bekannten Typ wünschen T, der dem RequestProtokoll entspricht.

Mit der Änderung von [Request]von [T]können Sie ein Array eines beliebigen Typs Requestanstelle eines Arrays eines Typs verwenden, der den Anforderungen entspricht.

1 Jessy Aug 28 2020 at 04:57
func execute(requests: [Request]) {}