2017-07-27 47 views
0

我在這裏發佈我的第一條消息,我有一個關於swift語言的邏輯問題。爲了您的信息,我在swift語言中很新,我用C++編寫代碼,如果你有一個客觀的觀點來看待如何正確地做事情(以一種優雅的方式),如果你有一些建議,請隨時做你的建議。變量'xxx'從未突變;在派生類

我用下面的超做一個自制的封裝:

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; 
    } 

} 

,我想創造一些子類包括超類,我只是改變取決於子類名的分隔符:

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

} 

因此,我只需要在我的程序中創建子類作爲var,添加值並將其包裝爲具有封裝字符串:

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

您認爲這是正確的方式嗎?還是有更好的方法呢?

我的主要問題是關於這個編譯器警告:

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

我改變了它的一個讓和它的作品。

所以有一些我不明白:爲什麼我可以改變超類的屬性,就好像繼承的子類被聲明爲常量?超類的存儲在哪裏?它是如何工作的?

回答

0

在夫特結構行爲有點不同於在C++中。 VAR防止更改的實際價值,因爲你正在使用的變量類型是變量持有參考,而不是實際的數據(如Level5_encapsulation * l5message)。

由於您沒有突變變量的值(A引用),編譯器會引發警告。