2017-08-02 61 views
1

我需要在String擴展名內打印String。我知道增加一個String與另一個String。但是,不能在類型'String'的不可變值上使用變異成員

爲什麼下面的代碼給我一個錯誤?

這樣可以解決這個錯誤嗎?

如果是,如何?

代碼:

extension String{ 

    func fruit(){ 
     //After some manipulation with self I need to print 
     print("Apple".parent("Tree")) 
     print("Tomato".parent("Plant")) 


    } 

    mutating func parent(_ word:String){ 

     self = self+" "+word 

    } 
} 

錯誤:

無法在類型的不可變的值使用可變成員 '字符串'

回答

8

你需要了解的區別一個返回值的非變異函數和一個void mu關閉功能。你寫的一個,是一個不同誘變作用:

mutating func parent(_ word:String){ 

    self = self+" "+word 

} 

這樣的變異函數可以使用這樣的:

var string = "Hello" 
string.parent("World") 
print(string) 

正如你所看到的,調用parent改變了存儲在值變量string


返回的函數是另一回事。這是相同的parent功能,改寫返回一個值:

func parent(_ word: String) -> String { 
    return self + " " + word 
} 

您可以使用此函數返回這樣的:

print("Apple".parent("Tree")) 
print("Tomato".parent("Plant")) 

在這種情況下,什麼都沒有改變。值正在「計算」並返回給調用者。

你在做什麼錯了基本上是試圖使用一個函數,如返回函數。

要解決這個問題,或者改變函數返回一個值,或者正確地使用變異函數,正如我向您展示的那樣。

+0

返回比分配給自己更好。 +1。 – Alexander

+0

第一個解決方案:當我需要打印1000個單獨的水果時,我認爲'var string =「Hello」'很差。它也給我一個錯誤:'不能分配類型'()'的值來鍵入'String?',而第二個是好的。感謝您的簡要解釋 –

+2

@ RAJAMOHAN-S如果您認爲我的答案回答您的問題,請考慮接受它! – Sweeper

1

parent是一種變異方法,由於fruit稱之爲fruit也是變異的,所以必須聲明爲這樣。

+1

如果我使'mutating func fruit()'也出現錯誤'不能在'String''類型的不可變值上使用變異成員。你能否用例子來詳細說明? –

相關問題