πŸ’‘ Swift κΈ°λ³Έ 문법 (2)

μ •λ‚˜μ˜Β·2022λ…„ 10μ›” 7일
0

πŸ“Ž ν•¨μˆ˜μ™€ ν΄λ‘œμ €

ν•¨μˆ˜: func ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ μ •μ˜, -> λ₯Ό μ‚¬μš©ν•΄μ„œ ν•¨μˆ˜μ˜ λ°˜ν™˜ νƒ€μž… 지정

func hello(name: String, time: Int) -> String {
	var string = ""
    for _ in 0.. < time {
    	string += "\(name)λ‹˜ μ•ˆλ…•ν•˜μ„Έμš”!\n"
    }
    return string
}

ν•¨μˆ˜ 호좜 μ‹œ, νŒŒλΌλ―Έν„° 이름을 ν•¨κ»˜ 써주어야 함

hello(name: "nang", time: 4)

ν•¨μˆ˜ 호좜 μ‹œ, νŒŒλΌλ―Έν„° 이름과 ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ μ‚¬μš©ν•˜λŠ” νŒŒλΌλ―Έν„° 이름을 λ‹€λ₯΄κ²Œ μ‚¬μš©ν•  경우

func hello(to name: String, numberOfTimes time: Int) {
	//ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œλŠ” nameκ³Ό time을 μ‚¬μš©
	for _ in 0.. < time {
    	print(name)
    }
}

hello(to: "nang", numberOfTimes:4) //to와 numberOfTimes μ‚¬μš©

νŒŒλΌλ―Έν„° 이름을 _둜 μ •μ˜ν•˜λ©΄ ν•¨μˆ˜ 호좜 μ‹œ, νŒŒλΌλ―Έν„° 이름 μƒλž΅ κ°€λŠ₯

func hello(_ name: String, time: Int) {
	// ...
}

hello("nang", time:4)

νŒŒλΌλ―Έν„°μ˜ κΈ°λ³Έκ°’ 지정 κ°€λŠ₯, κΈ°λ³Έ 값이 μ§€μ •λœ νŒŒλΌλ―Έν„°λŠ” ν•¨μˆ˜ ν˜ΈμΆœμ‹œ μƒλž΅ κ°€λŠ₯

func hello(name: String, time: Int = 1) {
	// ...
}

hello("nang")

...을 μ‚¬μš©ν•˜λ©΄ κ°œμˆ˜κ°€ 정해지지 μ•Šμ€ νŒŒλΌλ―Έν„°λ₯Ό 받을 수 있음

func sum(_numbers: Int...) -> Int {
	var sum = 0
    for number in numbers {
    	sum += number
    }
    return sum
}

sum(1,2)
sum(3,4,5)

ν•¨μˆ˜ μ•ˆμ— ν•¨μˆ˜ μž‘μ„± κ°€λŠ₯

func hello(name: String. time: Int) {
	func message(name: String) -> String {
    	return "\(name)λ‹˜ μ•ˆλ…•ν•˜μ„Έμš”!"
    }
    
    for _ in 0.. < time {
    	print(message(name: name))
    }
}

ν•¨μˆ˜ μ•ˆμ— μ •μ˜ν•œ ν•¨μˆ˜ λ°˜ν™˜ κ°€λŠ₯

helloGenerator() ν•¨μˆ˜μ˜ λ°˜ν™˜ νƒ€μž…μ€ (String) -> String
-> λ¬Έμžμ—΄μ„ λ°›μ•„μ„œ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜

func helloGenerator(message: String) -> (String) -> String {
	func hello(name: String) -> String {
    	return name + message
    }
    return hello
}

let hello = helloGenerator(message: "λ‹˜ μ•ˆλ…•ν•˜μ„Έμš”!")
hello("λ‚­")

ν•¨μˆ˜ μ•ˆμ— μ •μ˜ν•œ ν•¨μˆ˜κ°€ μ—¬λŸ¬ 개의 νŒŒλΌλ―Έν„°λ₯Ό λ°›λŠ” 경우

(String, String) -> String
: λ¬Έμžμ—΄ 두 개λ₯Ό λ°›μ•„μ„œ λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•˜λŠ” 의미

func helloGenerator(message: String) -> (String,String) -> String {
	func hello(firstName: String, lastName: String) -> String {
    	return lastName + firstName + message
    }
    return hello
}

let hello = helloGenerator(message: "λ‹˜ μ•ˆλ…•ν•˜μ„Έμš”!")
hello("λ‚˜μ˜","μ •")

πŸ“Ž ν΄λ‘œμ € (Closure)

ν΄λ‘œμ €: μ€‘κ΄„ν˜Έ( {} )둜 감싸진 'μ‹€ν–‰ κ°€λŠ₯ν•œ μ½”λ“œ λΈ”λŸ­'

func helloGenerator(message: String) -> (String, String) -> String {
	return { (firstName: String, lastName: String) -> String in
    	return lastName + firstName + message
    }
}

ν•¨μˆ˜μ™€λŠ” λ‹€λ₯΄κ²Œ ν•¨μˆ˜ 이름 μ •μ˜κ°€ λ”°λ‘œ μ‘΄μž¬ν•˜μ§€ μ•ŠμŒ
but, νŒŒλΌλ―Έν„°λ₯Ό 받을 수 있고, λ°˜ν™˜ 값이 쑴재
=> ν•¨μˆ˜λŠ” 이름이 μžˆλŠ” ν΄λ‘œμ €

func helloGenerator(message: String) -> (String, String) -> String {
	return { firstName, lastName in
    	return lastName + firstName + message
    }
}

🟰

func helloGenerator(message: String) -> (String, String) -> String {
	return {
    	return $1 + $0 + message
    }
}

ν΄λ‘œμ € λ‚΄λΆ€μ˜ μ½”λ“œκ°€ ν•œ 쀄이라면, return μƒλž΅ κ°€λŠ₯

func helloGenerator(message: String) -> (String, String) -> String {
	return { $1 + $0 + message }
}

ν΄λ‘œμ €λŠ” λ³€μˆ˜μ²˜λŸΌ μ •μ˜ κ°€λŠ₯

let hello: (String, String) -> String = { $1 + %0 + "λ‹˜ μ•ˆλ…•ν•˜μ„Έμš”!" }
hello("λ‚˜μ˜","μ •")

μ˜΅μ…”λ„λ‘œλ„ μ •μ˜ κ°€λŠ₯

let hello: ((String, String) -> String)?
hello?("λ‚˜μ˜", "μ •")

ν΄λ‘œμ €λ₯Ό λ³€μˆ˜λ‘œ μ •μ˜ν•˜κ³  ν•¨μˆ˜μ—μ„œ λ°˜ν™˜ν•  μˆ˜λ„ μžˆλŠ” κ²ƒμ²˜λŸΌ, νŒŒλΌλ―Έν„°λ„ 받을 수 있음

func manipulate(number: Int, using block: Int -> Int) -> Int {
	return block(number)
}

manipulate(number: 10, using: { (number: Int) -> Int in
	return number * 2
}) 
🟰
manipulate(number: 10, using: {
	$0 * 2
})

(먄약 ν•¨μˆ˜μ˜ λ§ˆμ§€λ§‰ νŒŒλΌλ―Έν„°κ°€ ν΄λ‘œμ €λΌλ©΄, κ΄„ν˜Έμ™€ νŒŒλΌλ―Έν„° 이름 μƒλž΅ κ°€λŠ₯)
manipulate(number: 10) {
	$0 * 2
}

πŸ“Œ sort() 와 filter()
ν•¨μˆ˜κ°€ ν΄λ‘œμ € ν•˜λ‚˜λ§Œμ„ νŒŒλΌλ―Έν„°λ‘œ λ°›λŠ”λ‹€λ©΄, κ΄„ν˜Έλ₯Ό μ•„μ˜ˆ 쓰지 μ•Šμ•„λ„ 됨

let numbers = [1,3,2,6,7,5,8,4]

let sortedNumbers = numbers.sort { $0 < $1 }
print(sortedNumbers) //[1,2,3,4,5,6,7,8]

let evens = numbers.filter { $0 % 2 == 0 }
print(evens) //[2,6,8,4]

πŸ“Ž ν΄λž˜μŠ€μ™€ ꡬ쑰체

ν΄λž˜μŠ€λŠ” class 둜, κ΅¬μ‘°μ²΄λŠ” struct 둜 μ •μ˜

class Dog {
	var name: String?
    var age: Int?
    
	func simpleDescription() -> String {
    	if let name = self.name {
        	return "🐢 \(name)"
        } else {
        	return "🐢 No name"
        }
    }
}

struct Coffee {
	var name: String?
    var size: String?
    
    func simpleDescription() -> String {
    	if let name = self.name {
        	return "β˜•οΈ \(name)"
        } else {
        	return "β˜•οΈ No name"
        }
    }
}

var myDog = Dog()
myDog.name = "룽지"
myDog.age = 3
print(myDog.simpleDescription()) 

var myCoffee = Coffee()
myCoffee.name = "아메리카노"
myCoffee.size = "Tall"
print(myCoffee.simpleDescription())

ν΄λž˜μŠ€λŠ” 상속 κ°€λŠ₯, κ΅¬μ‘°μ²΄λŠ” λΆˆκ°€λŠ₯

class Animal {
	let numberOfLegs = 4
}

class Dog: Animal {
	var name: String?
    var age: Int?
}

var myDog = Dog()
print(myDog.numberOfLegs) //Animal ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속받은 κ°’ (4)

ν΄λž˜μŠ€λŠ” μ°Έμ‘° (Reference),
κ΅¬μ‘°μ²΄λŠ” 볡사 (Copy)

var dog1 = Dog() //dog1은 μƒˆλ‘œ λ§Œλ“€μ–΄μ§„ Dog()λ₯Ό μ°Έμ‘°
var dog2 = dog1 //dog2λŠ” dog1을 μ°Έμ‘°ν•˜λŠ” Dog()λ₯Ό λ˜‘κ°™μ΄ μ°Έμ‘°
dog1.name = "룽지" /dog1의 이름을 λ°”κΎΈλ©΄ Dog()의 이름이 λ°”λ€œ
print(dog2.name) //dog2의 이름을 가져와도 바뀐 이름 좜λ ₯

var coffee1 = Coffee() //coffee1은 μƒˆλ‘œ λ§Œλ“€μ–΄μ§„ Coffee() κ·Έ 자체
var coffee2 = coffee1 //coffee2λŠ” coffee1을 λ³΅μ‚¬ν•œ κ°’
coffee1.name = "아메리카노" 
coffee2.name //coffee1의 이름을 바꿔도 coffee2λŠ” λ³„κ°œμ΄κΈ° λ•Œλ¬Έμ— λ°”λ€Œμ§€ μ•ŠμŒ (nil)

πŸ“Ž μƒμ„±μž (Initializer)

ν΄λž˜μŠ€μ™€ ꡬ쑰체 λͺ¨λ‘ μƒμ„±μžλ₯Ό 가지고 있음.
μƒμ„±μžμ—μ„œλŠ” μ†μ„±μ˜ μ΄ˆκΈ°κ°’ 지정 κ°€λŠ₯

class Dog {
	var name: String?
    var age: Int?
    
    init() {
    	self.age = 0
    }
}

struct Coffee {
	var name: String?
    var size: String?
    
    init() {
    	self.size = "Tall"
    }
}

속성이 μ˜΅μ…”λ„μ΄ μ•„λ‹ˆλΌλ©΄ 항상 μ΄ˆκΈ°κ°’μ„ κ°€μ Έμ•Ό ν•œλ‹€.
μ˜΅μ…”λ„μ΄ μ•„λ‹Œ 속성이 μ΄ˆκΈ°κ°’μ„ 가지고 μžˆμ§€ μ•ŠμœΌλ©΄ 컴파일 μ—λŸ¬ λ°œμƒ

class Dog {
	var name: String?
    var age: Int //컴파일 μ—λŸ¬
}
class Dog {
	var name: String?
    var age: Int = 0 //속성 μ •μ˜ν•  λ•Œ μ΄ˆκΈ°κ°’ 지정
}

속성을 μ •μ˜ν•  λ•Œ,
1) μ΄ˆκΈ°κ°’μ„ 지정해 μ£ΌλŠ” 방법

class Dog {
	var name: String?
    var age: Int = 0
}

2) μƒμ„±μžμ—μ„œ μ΄ˆκΈ°κ°’μ„ 지정해 μ£ΌλŠ” 방법

class Dog {
	var name: String?
    var age: Int
    
    init() {
    	self.age = 0
    }
}

ν•¨μˆ˜μ™€ λ§ˆμ°¬κ°€μ§€λ‘œ νŒŒλΌλ―Έν„°λ₯Ό 받을 수 있음

class Dog {
	var name: String?
    var age: Int
    
    init(name: String?, age: Int) {
    	self.name = name
        self.age = age
    }
}

var myDog = Dog(name: "룽지", age: 3)

λ§Œμ•½ 상속받은 클래슀라면 μƒμ„±μžμ—μ„œ μƒμœ„ 클래슀의 μƒμ„±μžλ₯Ό ν˜ΈμΆœν•΄μ£Όμ–΄μ•Ό 함
λ§Œμ•½ μƒμ„±μžμ˜ νŒŒλΌλ―Έν„°κ°€ μƒμœ„ 클래슀의 νŒŒλΌλ―Έν„°μ™€ κ°™λ‹€λ©΄ override ν‚€μ›Œλ“œ μ‚¬μš©

super.init() 은 클래슀 μ†μ„±λ“€μ˜ μ΄ˆκΈ°κ°’μ΄ λͺ¨λ‘ μ„€μ • 된 후에 ν•΄μ•Όν•œλ‹€.
후에 자기 μžμ‹ μ— λŒ€ν•œ self ν‚€μ›Œλ“œ μ‚¬μš© κ°€λŠ₯

class Dog: Animal {
	var name: String?
    var age: Int
    
    override init() {
    	self.age = 0 // μ΄ˆκΈ°κ°’ μ„€μ •
        super.init() //μƒμœ„ 클래슀 μƒμ„±μž 호좜
        print(self.simpleDescription()) //μ—¬κΈ°μ„œλΆ€ν„° self μ ‘κ·Ό κ°€λŠ₯
    }
    
    func simpleDescription() -> String {
    	if let name = self.name {
        	return "🐢 \(name)"
        } else {
        	return "🐢 No name"
        }
    }
}

-> super.init() 을 ν•˜κΈ° 전에 self 에 μ ‘κ·Όν•œλ‹€λ©΄ 컴파일 μ—λŸ¬!

πŸ“Ž 속성 (Properties)

  • λΆ„λ₯˜
    1) Stored Property (값을 κ°€μ§€λŠ” 속성)
    -속성이 κ°’ 자체λ₯Ό 가지고 있음
    2) Computed Property (κ³„μ‚°λ˜λŠ” 속성)
    -연산을 μˆ˜ν–‰ν•œ λ’€ κ·Έ κ²°κ³Όλ₯Ό λ°˜ν™˜
struct Hex {
	var decimal: Int?
    var hexString: String? {
    	get {
        	if let decimal = self.decimal {
            	return String(decimal, radix: 16)
            } else {
            	return nil
            }
       	}
        
        set {
        	if let newValue = newValue {
            	self.decimal = Int(newValue, radix: 16)
            } else {
            	self.decimal = nil
            }
        }
    }
}

var hex = Hex()
hex.decimal = 10
hex.hexString //"a"

hex.hexString = "b"
hex.decimal //11

decimal: Stored Property
hexString: Computed Property

get,set κ³Ό λΉ„μŠ·ν•œ willSet, didSet 을 μ΄μš©ν•˜λ©΄
속성에 값이 μ§€μ •λ˜κΈ° 직전과 직후에 μ›ν•˜λŠ” μ½”λ“œ μ‹€ν–‰ κ°€λŠ₯

struct Hex {
	var decimal: Int? {
    	willSet {
        	print("\(self.decimal)μ—μ„œ \(newValue)둜 값이 λ°”λ€” μ˜ˆμ •μž…λ‹ˆλ‹€.")
        }
        didSet {
        	print("\(oldValue)μ—μ„œ \(self.decimal)둜 값이 λ°”λ€Œμ—ˆμŠ΅λ‹ˆλ‹€.")
        }
    }
}

willSet : μƒˆλ‘œμš΄ 값을 newValue둜 μ–»μ–΄μ˜΄
didSet : μ˜ˆμ „ 값을 oldValue λΌλŠ” μ˜ˆμ•½μ–΄λ₯Ό 톡해 μ–»μ–΄μ˜΄

πŸ“Ž νŠœν”Œ (Tuple)

: κ°’λ“€μ˜ 묢음
값에 μ ‘κ·Όν•  λ•Œμ—λŠ” . μ‚¬μš©

var coffeeInfo = ("아메리카노", 5100)
coffeeInfo.0 //아메리카노
coffeeInfo.1 //5100

νŒŒλΌλ―Έν„°μ— 이름을 뢙일 수 있음

var namedCoffeeInfo = (coffee: "아메리카노", price: 5100)
namedCoffeeInfo.coffee //아메리카노
namedCoffeeInfo.price //5100
namedCoffeeInfo.price = 5100
  • νŠœν”Œμ˜ νƒ€μž… μ–΄λ…Έν…Œμ΄μ…˜
var coffeeInfo: (String, Int)
var namedCoffeeInfo: (coffee: String, price: Int)

μ—¬λŸ¬ λ³€μˆ˜μ— κ°’ 지정

let (coffee, price) = ("아메리카노", 5100)
coffee //아메리카노
price //5100

νŠœν”Œμ΄ 가진 κ°’μœΌλ‘œ λ³€μˆ˜μ— 값을 지정할 λ•Œ, λ¬΄μ‹œν•  값은 _ ν‚€μ›Œλ“œλ₯Ό μ‚¬μš©

let (_, latteSize, lattePrice) = ("라떼", "Venti", 5600)
latteSize //Venti
lattePrice //5600

νŠœν”Œμ„ λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜

//컀피 이름에 λ§žλŠ” 컀피 가격 정보 λ°˜ν™˜. μΌμΉ˜ν•˜λŠ” 이름이 μ—†λ‹€λ©΄ 'nil' λ°˜ν™˜

func coffeeInfo(for name: String) -> (name: String, price: Int)? {
	let coffeeInfoList: [(name: String, price: Int)] = [
    	("아메리카노", 5100),
        ("라떼", 5600),
    ]
    for coffeeInfo in CoffeeInfoList {
    	if coffeeInfo.name == name {
        	return coffeeInfo
        }
    }
    return nil
}

coffeeInfo(for: "아메리카노")?.price //5100
coffeeInfo(for: "μ—μŠ€ν”„λ ˆμ†Œ")?.price //nil

let (_, lattePrice) = coffeeInfo(for: "라떼")!
lattePrice //5600

0개의 λŒ“κΈ€