2017-07-27 3 views
0

Ich poste meine erste Nachricht hier, ich habe eine logische Frage über schnelle Sprache. Zu Ihrer Information, ich bin ziemlich neu in der schnellen Sprache, ich benutze Code in C++ und es ist ein bisschen schwierig für mich, einen objektiven Standpunkt zu haben, wie man die Dinge richtig macht (in eleganter Weise), wenn Sie Haben Sie einige Ratschläge, zögern Sie nicht, Ihre Vorschläge zu machen.Variable 'xxx' wurde nie mutiert; in abgeleiteten Klasse

Ich bin ein selbstgemachtes Verkapselung tun das folgende übergeordnete Klasse mit:

class MultiLevel_encapsulation { 

    var separator = ""; 

    var datas:[String:String] = [:] 

    func wrap() -> String{ 
     var out:String = "" 
     var i = 0 
     for (key, data) in datas{ 
      if i==0{ 
       out += key + separator + data 
      } 
      else{ 
       out += separator + key + separator + data 
      } 

      i+=1 
     } 
     return out 
    } 

    func unwrap(content:String){ 
     let split = content.components(separatedBy: separator) 
     var i = 1 
     while(i < split.count){ 
      datas[split[i-1]] = split[i] 
      i += 2 
     } 
    } 

    func getAttributesNames() -> [String]{ 
     var out:[String] = [] 
     for (key, _) in datas{ 
      out.append(key) 
     } 
     return out 
    } 


    func getValue(name:String) -> String? { 
     return datas[name]; 
    } 

    func setValue(name:String, value:String){ 
     datas[name] = value; 
    } 

} 

und ich möchte einige Unterklassen einschließlich der übergeordneten Klasse erstellen, ich habe gerade das Trennzeichen ändern der Unterklasse Name abhängig:

class Level5_encapsulation: MultiLevel_encapsulation{ 
    init(message:String) { 
     super.init() 
     separator = "&&LEVEL5&&" 
     unwrap(content:message) 
    } 
    override init() { 
     super.init() 
     separator = "&&LEVEL5&&" 
    } 

} 

Also nach es muss ich nur die Unterklasse als Var in meinem Programm erstellen, fügen Sie Werte und wickeln Sie es mit einer eingekapselten Zeichenfolge:

var l5message = Level5_encapsulation() 
l5message.setValue(name: #anyTitle#, value: #anyValue#) 
var output = l5message.wrap() // String with encapsulated message 

Denken Sie, dass es der richtige Weg ist, oder gibt es dafür einen besseren Weg?

Meine Hauptfrage ist zu dieser Compiler-Warnung:

Variable 'l5message' was never mutated; consider changing to 'let' constant 

habe ich es für einen let und es funktioniert.

Es gibt also etwas, was ich nicht verstehe: Warum kann ich Eigenschaften in der Oberklasse ändern, als ob die geerbte Unterklasse als Konstante deklariert wäre? Wo ist der Speicher der Superklasse und wie funktioniert es?

Antwort

0

In Swift Klassen und Strukturen verhalten sich ein bisschen anders als in C++. var und ließen verhindern, dass Änderungen an den tatsächlichen Wert, und da den Variablentyp, die Sie verwenden ist eine Klasse die Variablen halten eine Referenz und nicht die eigentlichen Daten (wie Level5_encapsulation * l5message).

Da Sie den Wert der Variablen (A reference) nicht mutieren, löst der Compiler eine Warnung aus.

Verwandte Themen