2017-08-02 6 views
1

String内にStringを印刷する必要があります。私は、Stringと別のStringの1つの追加を認識しています。しかし、'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を返すテーティング機能。あなたが書いた1は、変異関数である。このような

変異さ機能は次のように使用することができます

mutating func parent(_ word:String){ 

    self = self+" "+word 

} 
:あなたが見ることができるように

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

parentへの呼び出しはに格納されている値を変更します変数string


返す機能は別の問題です。

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

あなたはこのように返します。この機能を使用することができます:これは値を返すように書き換え同じparent関数であり、この場合、

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

を、何も変更されていません。値は単に「計算され」、呼び出し元に返されます。

あなたが間違っているのは、基本的にのように、を返す関数のような突然変異関数を使用しようとしています。

これを修正するには、値を返すように関数を変更するか、または私があなたに示したように、突然変異関数を適切に使用してください。

+0

返すことは自己に割り当てるよりも優れています。 +1。 – Alexander

+0

最初の解決策:別の果物を1000枚印刷する必要がある場合、 'var string =" Hello "'が悪いと思います。また、それは私にエラー 'タイプ '()の値を割り当てることができません'タイプ '文字列?''と2番目のものが良いです。簡単な説明をありがとう –

+2

@ RAJAMOHAN-S私の答えがあなたの質問に答えると思うなら、それを受け入れることを検討してください! – Sweeper

1

parentは、変異法であり、fruitはそれを呼び出すため、fruitも変異され、そのように宣言されなければなりません。

+1

もし 'mutating func fruit()'を作成したとしても、 'String'型の不変の値に対してはmutatingメンバーを使用できません。あなたは例を詳しく教えていただけますか? –

関連する問題