2016-11-20 4 views
0

Dies ist das Problem:kann nicht von einer schnellen Erweiterung SUBSCRIPT

typealias Byte = UInt8 

protocol ByteProtocol {} 
extension UInt8: ByteProtocol {} 

extension Array where Element: ByteProtocol { 

    subscript (index: Int) -> UInt8 { 
     return self[Int(index % self.count)] 
    } 

} 

Dies will mich ersäufen gibt, auch wenn es mathematisch unmöglich ist:

var p: [Byte] = [Byte]() 
p.append(15) 
print(p[10]) 

Also, was der Fehler ist hier? P.S. Vielen Dank für Ihre Antwort :)

+0

Das 'Int' initializer Anruf redundant ist. – Alexander

Antwort

3

Sie können auf diese Weise keine tiefgestellten Indizes überladen. Selbst wenn Sie könnten, würden Sie eine Endlosschleife in Ihrer Implementierung erstellen. Ihre Implementierung wäre auch illegal, da sie etwas anderes als Element zurückgibt.

Was Sie meinen, ist so etwas wie dieses:

extension Array where Element: ByteProtocol { 

    subscript (wrapping index: Int) -> Element { 
     return self[Int(index % self.count)] 
    } 
} 

var p: [Byte] = [Byte]() 
p.append(15) 
print(p[wrapping: 10]) 
+1

Schlag mich dazu D: – Alexander

+5

Und * dann * könnte es eine unbeschränkte Erweiterung sein (die Where-Klausel könnte eine Konsequenz der vorherigen Frage von OP sein). - Kleinere Bemerkung: 'self [index% self.count]' ist ausreichend. –

1

Es gibt Ihnen keinen "Überlauf". Sie erhalten einen Fehler außerhalb des zulässigen Bereichs. In einem Array mit nur einem Element gibt es keinen Elementindex 10. Der Absturz tritt auf, bevor Ihre subscript Implementierung jemals aufgerufen wird (wie Sie es leicht finden könnten, indem Sie es brechen). Sie können die Bedeutung einer vorhandenen subscript Implementierung nicht in der Weise verändern, wie Sie es sich wünschen.

+0

Schauen Sie sich die Implementierung seines Index an. – Alexander

+0

@AlexanderMomchliov Es wird nie aufgerufen. Er hätte das leicht entdecken können, indem er einen Haltepunkt darauf setzte. – matt

+0

Ja, mir ist das bekannt. – Alexander

0

Die Standardimplementierung des Index wird aufgerufen, nicht Ihre. Daher versucht es, auf das 10. Element zuzugreifen, das nicht existiert.

Sie können das Verhalten einer Struktur wie Array mit einer Erweiterung nicht überschreiben. Sie sind nicht polymorph. Sie können jedoch eine neue Definition eines Indexes hinzufügen, wie rob gezeigt hat.

Verwandte Themen