IT工房くまや

通称くまが運営するIT工房サイト

Swiftのclassとstructについて調べてみました

結論としては、特にこだわりが無ければ、structを使う方がよいようです。

classの継承を使いたいときや、Object-Cと連携させたいときはclassを使わないといけないようです。

参照渡しを利用したいとき。つまり、

struct TestStruct {
	var sampleStruct: String 
	init(){
		sampleStruct = ""
	}
}

class TestClass {
	var sampleClass: String 
	init(){
		sampleClass = ""
	}
}

var testStruct = TestStruct()
var testClass = TestClass()

testStruct.sampleStruct = "Hello"
testClass.sampleClass = "Hello"

var ts1 = testStruct
var ts2 = testStruct
var tc1 = testClass
var tc2 = testClass

ts1.sampleStruct = "なんでやねん"
tc1.sampleClass = "なんでやねん"

print("structは値渡しなのでts2.sampleStructは\(ts2.sampleStruct)のままです。")
//structは値渡しなのでts2.sampleStructはHelloのままです。
print("classは参照渡しなのでtc2.sampleClassは\(tc2.sampleClass)に変わります。")
//classは参照渡しなのでtc2.sampleClassはなんでやねんに変わります。

上記のように、変数testStruct、testClassに実装し、プロパティtestStruct.sampleStruct、testClass.sampleClassに”Hello”を代入後、変数ts1、ts2に変数testStruct、tc1、tc2にtestClassを代入し、プロパティts1.sampleStruct、tc1.sampleClassを”なんでやねん”に変更した時、

structの場合、ts2.sampleStructは”Hello”のままですが、

classの場合、tc2.sampleClassは”なんでやねん”に変わります。

ということで、プロパティの値を変更したら、他のも変更させたいときはclassを使うようです。