struct PersonStruct {
var name: String
var age: Int
//class์ ๋ค๋ฅด๊ฒ struct๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋ฉค๋ฒ์์ด์ฆ ์ด๋์
๋ผ์ด์ ๊ฐ ์์ฑ๋๋ค.
}
class PersonClass {
var name: String
var age: Int
//๋ฉค๋ฒ์์ด์ฆ ์ด๋์
๋ผ์ด์
init(name: String, age: Int){
self.name = name
self.age = age
}
}
๐กํด๋์ค์ ๊ตฌ์กฐ์ฒด์ ํ๋กํผํฐ๋ค์ ๋ฐ๋์ ์ด๊ธฐํ ๋์ด์ผ ํ๋ค.
var struct1: PersonStruct = PersonStruct(name: "choi", age: 22);
let class1: PersonClass = PersonClass(name: "hoon", age: 21);
var struct2: PersonStruct = struct1;
let class2: PersonClass = class1;
//๊ตฌ์กฐ์ฒด๋ ๊ฐ์ ๋ณต์ฌํด์ ์ ๋ฌํ๋ค.
struct2.name="jun";
print(struct1.name) //choi, ๊ตฌ์กฐ์ฒด๋ ๊ฐ๊ฐ์ด ์กด์ฌํ๋ค.
//ํด๋์ค๋ ๊ฐ์ ๋ณต์ฌํ์ง ์๊ณ ์ธ์คํด์ค์ ์์น๋ฅผ ์ฐธ์กฐํ๋ค.
class1.age = 32
print(class2.age) //32, ๊ฐ์๊ณณ์ ์ฐธ์กฐํจ์ผ๋ก ํจ๊ป ๋ณํ๋ค
//ํด๋์ค ์ฐธ์กฐ ์๋ณ ์ฐ์ฐ์ ===
print(class1 === class2) //true
์ ๋ฌ์ธ์(๋งค๊ฐ๋ณ์)๋ก์ ํด๋์ค์ ๊ตฌ์กฐ์ฒด๊ฐ ์ ๋ฌ๋ ๋ ์ญ์ ๊ฐ์ ๊ฐ๋
์ด ์ ์ฉ๋๋ค.
๐กinout๋งค๊ฐ๋ณ์๋ฅผ ํ์ฉํ๋ฉด ์๋ ์ฝ๋์ฒ๋ผ ๊ตฌ์กฐ์ฒด๋ ์ฐธ์กฐ๋ฐฉ์์ ์ฌ์ฉํ ์ ์๋ค.
func referStruct(_ refer: inout PersonStuct) -> Void {
refer.name = "change";
}
func referClass(_ refer: PersonClass) -> Void {
refer.name = "change";
}
referStruct(&struct1); //inout ๋งค๊ฐ๋ณ์ ์ ๋ฌ๋ฐฉ์
referClass(class1);
print(struct1.name) //change
print(class1.name) //change
๐์ฌ์ฉ์๊ธฐ
//lazy ํค์๋๋ฅผ ํ๋กํผํฐ ์์ ์์ฑํด์ค๋ค.
struct LazyStruct {
lazy var lazyVar: String = "lazy man"
}
๐ฒ์์ธ์ฌํญ: ์ง์ฐ์ ์ฅํ๋กํผํฐ๊ฐ let์ผ๋ก ์ ์ธ๋ฌ์ ๊ฒฝ์ฐ
struct LazyStruct {
lazy let lazyVar: String = "lazy man"
}
let lazyClass: LazyStruct = LazyStruct();
print(lazyClass.lazyVar); //cannot use mutating getter on immutable value
lazyClass.lazyVar๋ฅผ ํธ์ถํ ๋ lazyVar์ ๊ฐ์ด ํ ๋น๋๋ค.
let ํค์๋๋ก ์ ์ธ๋ ํ๋กํผํฐ๋ ์ด๊ธฐํ ์์๋ง ๊ฐ ํ ๋น์ด ๊ฐ๋ฅํจ์ผ๋ก ์๋ฌ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ค.
struct MyInform {
var name: String
//์ฐ์ฐํ๋กํผํฐ sayHello
var sayHello: String {
get {
name + "์
๋๋ค" //์ฝ๋๊ฐ ํ์ค์ด๋ผ๋ฉด returnํค์๋ ์๋ต๊ฐ๋ฅ
}
set(newName) { //์ ๋ฌ์ธ์๋ฅผ ์์ฑํ์ง ์์ผ๋ฉด newValue๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
name = newName;
}
}
//age ํ๋กํผํฐ ๊ฐ์์
var age: Int {
//๊ฐ ๋ณ๊ฒฝ ์ง์ ์คํ๋๋ค.
//์ ๋ฌ์ธ์๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด newValue, oldValue๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉ๊ฐ๋ฅํ๋ค.
willSet(newOne) {
print("age๊ฐ์ด \(newOne)๋ก ๋ณ๊ฒฝ๋ฉ๋๋ค.");
}
//๊ฐ ๋ณ๊ฒฝ ํ ์คํ๋๋ค.
didSet(oldOne) {
print("age๊ฐ์ด \(oldOne)์์ \(age)๋ก ๋ฐ๊ผ์ต๋๋ค.");
}
}
}
var myName: MyInform = MyInform(name: "choi", age: 22);
print(myName.sayHello); // choi์
๋๋ค (get)
myName.sayHello = "hoon"; // (set)
print(myName.sayHello); // hoon์
๋๋ค (get)
myName.age = 44; //age๊ฐ์ด 44๋ก ๋ณ๊ฒฝ๋ฉ๋๋ค.(willSet) age๊ฐ์ด 22์์ 44๋ก ๋ฐ๊ผ์ต๋๋ค.(didSet)
๐กํ๋กํผํฐ์ ๊ฐ์ด ์ด๊ธฐํ๋ ๋๋ ํ๋กํผํฐ ๊ฐ์์ ๋งค์๋๊ฐ ํธ์ถ ๋์ง ์์ต๋๋ค.๐ฎ
๐ํ๋กํผํฐ ๊ฐ์์, ์ฐ์ฐ ํ๋กํผํฐ๋ ํ๋กํผํฐ์ ์ฐ์์ง๋ง ํด๋น๊ธฐ๋ฅ์
๋ชจ๋ ์ ์ญ, ์ง์ญ๋ณ์๊ฐ ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
c , cpp ์ธ์ด์ static๊ณผ ์ ์ฌํ ๊ฐ๋ ์ด๋ค.
struct TypeStruct {
static let myStaticProp = 100;
var calcProp: Int {
get {
Self.myStaticProp //๋๋ฌธ์ Self๋ ๋ด๋ถ์์ ํ์
์์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
}
}
}
//ํ์
์ ํตํด ์ง์ ํธ์ถ
print(TypeStruct.myStaticProp) //100
var ts: TypeStruct = TypeStruct();
print(ts.calcProp); //100
๐กself๋ ๋ด๋ถ์์ ์ธ์คํด์ค๋ฅผ ๊ฐ๋ฆฌํค๊ณ Self๋ ๋ด๋ถ์์ ํ์
์์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
self๋ ๋ชจ๋ ์ธ์คํด์ค๊ฐ ์์์ ์ผ๋ก ์์ฑํ๋ ํ๋กํผํฐ์ด๋ค.
์๊ธฐ ์์ ์ ๊ฐ๋ฆฌํค๋ ๊ฒ์ผ๋ก, ํด๋์ค๋ ๊ตฌ์กฐ์ฒด ๋ฑ์ ์ธ์คํด์ค ๋ด์์ ์ฌ์ฉํ ์ ์๋ค.
๊ตฌ์กฐ์ฒด๋ ์ด๊ฑฐํ์ผ ๊ฒฝ์ฐ, self ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํด ์๊ธฐ ์์ ์ผ๋ก ๊ต์ฒด(์นํ)๊ฐ ๊ฐ๋ฅํ๋ค.
ํด๋์ค๋ ์ฐธ์กฐ ํ์
์ด๋ผ, self ํ๋กํผํฐ์ ๋ค๋ฅธ ์ฐธ์กฐ๋ฅผ ํ ๋นํ ์ ์๋ค.
Self๋ ํ์
์ด๋ค. ํน์ ํ ํ์
์ด ์๋๋ผ, ํ์
์ ์ด๋ฆ์ ๋ฐ๋ณตํด ์์ฑํ์ง ์๊ณ
ํ์ฌ ํ์
์ ๊ฐ๋ฆฌํค๋ ์ฝ๋๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด ์ค๋ค
WritableKeyPath<AddressStruct, String>
๋ฅผ ์ฌ์ฉํ๋ค.ReferenceWritableKeyPath<AddressClass, String>
๋ฅผ ์ฌ์ฉํ๋ค.struct AddStruct {
var home: String
var email: String
}
class AddClass {
var home: String = ""
var email: String = ""
}
// \, . ๋ฅผ ์ด์ฉํด ์ ์ธ์ด ๊ฐ๋ฅํ๋ค.
var structKeyPath = \AddStruct.home;
var classKeyPath = \AddClass.home;
//๊ตฌ์กฐ์ฒด์ ํด๋์ค์ ํค๊ฒฝ๋ก๋ ๋ค๋ฅธ ํ์
์ ๊ฐ์ง๋ค.
print(type(of: structKeyPath)) //WritableKeyPath<AddStruct, String>
print(type(of: classKeyPath)) //ReferenceWritableKeyPath<AddClass, String>
var structInstance: AddStruct = AddStruct(home: "Seoul", email: "email@naver.com");
//ํด๋น ํ๋กํผํฐ์ ํค๊ฒฝ๋ก๋ฅผ ์ ๋ฌํด ๊ฐ์ ์ถ์ถํ ์ ์๋ค.
print( structInstance[keyPath: structKeyPath] ); //Seoul
//ํด๋นํ๋กํผํฐ๋ฅผ ์์ ํ ์ ์๋ค. ์์์ธ ๊ฒฝ์ฐ๋ ๋ถ๊ฐ๋ฅํ๋ค.
structInstance[keyPath: structKeyPath] = "Daejun";
print( structInstance[keyPath: structKeyPath] ); //Daejun
//.self ๋ฅผ ์ฌ์ฉํด ํ์
์ ์ ์ถ์ํฌ ์ ์๋ค.
print( structInstance[keyPath: \.self.email ] ) //email@naver.com
๐์๋ด์ฉ์ค [keyPath:]์ ์ฌ์ฉ์ ๋ํด์๋ ์๋ธ์คํฌ๋ฆฝํธ ํฌ์คํ
์์ ์ ๋ฆฌํ๋๋ก ํ๊ฒ ๋ค.
struct MyStruct {
var name: String
//๊ตฌ์กฐ์ฒด์ ๊ฒฝ์ฐ ๋ด๋ถํ๋กํผํฐ์ ๊ฐ์ ๋ณ๊ฒฝ(mutate)ํ๋ ๋งค์๋๋ mutating ํค์๋๋ฅผ ๋ถ์ฌ์ค์ผ ํ๋ค.
//ํด๋์ค๋ ์๊ด์๋ค.
mutating func changeName(_ name: String) {.
self.name = name; //mutating
}
mutating func allnewStruct(_ name: String) {
//๊ตฌ์กฐ์ฒด์ ๊ฒฝ์ฐ๋ง self๋ฅผ ์ฌ์ฉํด ์๊ธฐ์์ ์ ์นํ์ํฌ ์ ์๋ค.
self = MyStruct(name: name);
}
//์ธ์คํด์ค ํจ์์ฒ๋ผ ํธ์ถ ํ ์ ์๋๋ก ํด์ค๋ค.
func callAsFunction() {
print(name);
}
//๊ฐ์์ ํ ์์ด ์์ฑ ๊ฐ๋ฅํ๋ค.
func callAsFunction(_ remark: String) {
print("my name is \(name), \(remark)");
}
}
var myName: MyStruct = MyStruct(name: "choi");
myName() //choi
myName.changeName("hoon")
myName() //hoon
myName.allnewStruct("young")
myName() //young
myName("nice to meet you.") //my name is young, nice to meet you.
class Aclass {
static func sayHello(){
print("Hello~")
}
class func sayGoodBye() {
print("Good Bye")
}
static func hiAndBye() {
//ํ์
๋งค์๋์์ self๋ ์ธ์คํด์ค๊ฐ ์๋ ํ์
์์ฒด๋ฅผ ๊ฐ๋ฆฌํจ๋ค.
self.sayHello();
self.sayGoodBye();
}
}
class Bclass: Aclass{
//ํ์
๋งค์๋ ์ฌ์ ์
override class func sayGoodBye(){
print("Good Bye, see you again!")
}
}
Aclass.hiAndBye(); //Hello~ Good Bye
//์ฌ์ ์ ๋ฌ์์ผ๋ก ์ฌ์ ์์ ๋งค์๋๋ ์คํ๋์ง ์๋๋ค.
Bclass.sayGoodBye(); //Good Bye, see you again!
struct School {
var name: String;
init?(_ name: String){
if name.isEmpty {
return nil;
}
self.name = name;
}
}
var mySchool: School? = School("")
print(mySchool) //nil
//์ด๊ฑฐํ ํ์ฉ
enum SchoolAge: String{
case elementary="์ด๋ฑํ์"
case middle="์คํ์"
init?(_ age: Int){
switch(age){
case 8...13:
//self๋ฅผ ์ฌ์ฉํ์ฌ ์์ ์ง์
self = .elementary
case 14...16:
self = .middle
default:
return nil
}
}
}
//์ด๊ธฐํ ์คํจ์ ์ต์
๋๊ฐ์ ๋ฐ์์ผ ํจ์ผ๋ก ์ต์
๋ํ์
์ผ๋ก ์ ์ธํ๋ค.
var choi: SchoolAge? = SchoolAge(22);
print(choi == Optional<SchoolAge>.none); //true
๐ก์ด๊ฑฐํ ํญ๋ชฉ์ rawValue๋ก ์กฐํํ๋ ๋ฐฉ๋ฒ์ ์คํจ๊ฐ๋ฅํ ์ด๋์
๋ผ์ด์ ์ ์์์ด๋ค.
enum ForSearch: Int{
case zero, one
init?(value: Int){
switch value {
case 0:
self = .zero
case 1:
self = .one
default:
return nil;
}
}
}
//value๋ฅผ rawValue๋ก ๋ฐ๊พธ๊ธฐ๋ง ํ๋ฉด ๊ธฐ์กด ๋งค์๋๋ ์ผ์นํ๋ค.
var test: ForSearch? = ForSearch(value: 2)
print(test); //nil
์ด๊ธฐํ ํด๋ก์ ๋ด๋ถ ์ ์์ฌํญ
struct ClosureStruct {
var name: String = {
() -> String in //์๋ต๊ฐ๋ฅํ ํํ
return "choi" //ํ๋กํผํฐ ํ์
์ธ String
}() //ํด๋ก์ ๋ฅผ ์คํ๊ฐ์ ๋ฐํํด์ผ ํจ์ผ๋ก ()๋ถ์ฌ ์คํ๋ฌธ์ผ๋ก ์์ฑํ๋ค.
}
var me: ClosureStruct = ClosureStruct();
print(me.name); //choi
๐ํด๋ก์ ๋ ํด๋ก์ ํฌ์คํ
์์ ์์ธํ๊ฒ ์ค๋ช
ํ๊ฒ ๋ค.
class SomeClass{
deinit {
print("good bye");
}
}
var test: SomeClass? = SomeClass();
//์ธ์คํด์ค๊ฐ ์ด๋๊ณณ์๋ ์ฐธ์กฐ๋์์ง ์์์ผ๋ก ์๋ฉธ๋๋ค.๐deinitํธ์ถ
test = nil; //good bye