2016-11-04 4 views
1

Ich möchte Optional erweitern, wobei Wrapped ein Array ist (mit Elementen eines beliebigen Typs). Mit anderen Worten, ich möchte [Any]? eine Funktion hinzufügen. Ich bin mir nicht sicher, wie ich das erklären soll. Ich habe versucht:Swift: Optionales Array erweitern

1.

extension Optional where Wrapped: Array 

Ergebnisse in:

error: reference to generic type 'Array' requires arguments in <...> 

2.

extension Optional where Wrapped: Array<Any> 

Ergebnisse in:

type 'Wrapped' constrained to non-protocol type 'Array<Any>' 

und verschiedene andere ähnliche Erklärungen. Hilfe wird geschätzt.

+2

Was wäre diese Erweiterung genau? Mit anderen Worten, welche Funktion würde es sein, dass Sie nur hinzufügen möchten? [ – matt

+0

] Ich möchte eine praktische Funktion hinzufügen, die 1) ein Element anfügt, wenn das Array nicht-Null ist und 2) initialisiert Das Array mit nur dem Element, wenn das Array null ist. – Connor

+2

@ConnorNeville Sie meinen 'array = (array ?? []) + [element]'? IMO, das ist nicht wirklich eine Erweiterung wert (unter Berücksichtigung der Problemumgehungen, die Sie durchlaufen müssen, um es funktionieren zu lassen). – Hamish

Antwort

1

Ja das Problem hier ist, dass in dieser Linie,

extension Optional where Wrapped: Array<Any> 

die 'Array' sollte ein Protokoll sein, in allgemeinerer Art und Weise:

extension Type where Element: Protocol 

Die Lösung, die ich bekam ist hässlich, aber Werke, bedenken Sie:

protocol ArrayOfAny {} 
struct ArrayAny<Element: Any>: ArrayOfAny { 
    let array: [Element] 
    init(_ array: [Element]) { 
     self.array = array 
    } 
}  

Da dies:

extension Array: ArrayOfAny where Element: Any {} 

nicht unterstützt wird ...

dann können Sie nur dies tun:

extension Optional where Wrapped: ArrayOfAny 

Hoffe, es hilft :)