2016-03-30 19 views
1

Bu yüzden bir Vector yapıya sahip demek İki Vectors'u birbirine ekleyen ve soldaki değeri (+= gibi) sonucuna ayarlayan bir infix işlevi oluşturmak istiyorum, o zaman çalışmıyor:Mutasyona Uğrayan telkin Fonksiyonlar

func +=(left: Vector, right: Vector) 
{ 
    left.x += right.x 
    left.y += right.y 
} 

Kodumda denediğimde, hiçbir şey yapmıyor. Vector yapısını bir sınıfa dönüştürürsem, o zaman çalışır.

Swift'in structs kopyasını ve classes referanslarını bildiğini biliyorum, bunun için bir yolu var mı yoksa bu imkansız mı?

Şimdiden teşekkürler! değeri kaydedilir, böylece

cevap

2

sizin += fonksiyonunda mevcut haliyle üzerinde, bir değişmez değerinin üyelerini mutasyona çalışıyorsanız Kendileri, değişmez olan tipi. inout anahtar sözcüğünü, işlev imzasında left'a eklerseniz, bu değer türü değiştirilemez duruma gelir ve mutasyonu inout aracılığıyla güncelleştirilir: kopyalamada kopyalama kopyalama davranışı (derleyici optimizasyonu: mümkünse, kopya ek yükünü önlemek amacıyla uygulamada pratik olarak)), bundan sonra += işleviniz amaçlandığı gibi çalışacaktır.

func +=(inout left: Vector, right: Vector) 
{ 
    left.x += right.x 
    left.y += right.y 
} 

başlangıçtaki fonksiyon sınıf türleri için çalıştı nedeni değişmez bir referans türünde bir üye, değişken kendilerini olmasıdır; sadece referansın kendisi mutasyona uğramamış olabilir.

2

Sadece sol param için inout parametreyi ekleyin:

func += (inout left : Vector, right: Vector) 
{ 
    left.x += right.x 
    left.y += right.y 
} 
İlgili konular