2016-03-28 8 views
9

Hier ist eine einfache Verwendung eines statischen Element innerhalb einer Instanz-Methode:Warum bekomme ich "Statisches Mitglied '...' kann nicht auf Instanz vom Typ '...'" Fehler verwendet werden?

public struct RankSet { 
    private let rankSet : UInt8 
    static let counts : [UInt8] = [ 
     0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 
     ... // More of the same 
     4, 5, 5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8 
    ] 
    public var count : Int { 
     get { 
      // The error is on the following line 
      return Int(counts[Int(rankSet)]) 
     } 
    } 
} 

Swift erzeugt den folgenden Fehler:

Static member 'counts' cannot be used on instance of type 'RankSet'

Da statische Mitglieder von allen Instanzen meiner Klasse gemeinsam genutzt werden, alle Instanz Mitglieder, einschließlich count, sollten Zugriff auf das Mitglied counts haben. Was geht hier vor sich?

Antwort

24

Die Fehlermeldung ist irreführend: Auf statische Elemente kann von jedem Code zugegriffen werden, der für sie ordnungsgemäß sichtbar ist, einschließlich der Instanzmethoden.

Swift bietet jedoch keinen Kurznamenzugriff auf statische Member von Instanzmethoden - ein gemeinsames Merkmal vieler anderer Programmiersprachen. Dies ist der Grund für den oben genannten Fehler.

Swift besteht auf voll qualifizierenden Namen von statischen Mitglieder wie folgt:

public var count : Int { 
    get { 
     return Int(RankSet.counts[Int(rankSet)]) 
     //   ^^^^^^^^ 
    } 
}