[πŸ“ iOS TIL] #11 ... Swift 심화 문법 정리 #1

TaeUkΒ·2024λ…„ 3μ›” 12일
0

🍎 iOS TIL

λͺ©λ‘ 보기
10/18
post-thumbnail

Swift 심화 문법 κ°•μ˜ 정리 πŸ’» #1

ν”„λ‘œνΌν‹° μ˜΅μ €λ²„

: ν”„λ‘œνΌν‹°λ₯Ό κ΄€μ°°(observe)ν•˜λ©΄μ„œ λ³€κ²½ 사항이 λ°œμƒν•  λ•Œ μ‹€ν–‰

willSetλ³΄λ‹€λŠ” didSet이 많이 μ‚¬μš©λ¨

didSet

didSet은 μƒˆ 값이 μ €μž₯된 직후에 호좜

이전 ν”„λ‘œνΌν‹°μ˜ 값이 oldValue 둜 제곡

willSet

willSet은 값이 μ €μž₯되기 직전에 호좜

μƒˆλ‘œμš΄ ν”„λ‘œνΌν‹°μ˜ 값이 newValue 둜 제곡

var name: String = "Unknown" {
    willSet {
        print("ν˜„μž¬ 이름 = \(name), λ°”λ€” 이름 = \(newValue)")
    } // newVal은 λ³€κ²½ 될 μƒˆλ‘œμš΄ κ°’
    didSet {
        print("ν˜„μž¬ 이름 = \(name), λ°”λ€ŒκΈ° μ „ 이름 = \(oldValue)")
    } // oldVal은 λ³€κ²½ μ „ myProperty의 κ°’
}
 
name = "Peter"
// willSet이 λ¨Όμ € 싀행됨
// ν˜„μž¬ 이름 = Unknown, λ°”λ€” 이름 = Peter
// ν˜„μž¬ 이름 = Peter, λ°”λ€ŒκΈ° μ „ 이름 = Unknown

ν”„λ‘œνΌν‹° μ˜΅μ €λ²„λ₯Ό ν™œμš©ν•˜λ©΄ κΈ°μ‘΄ ν”„λ‘œνΌν‹° 값을 μˆ˜μ •λ  λ•Œλ§ˆλ‹€, λ™μ‹œμ— 값이 λ³€κ²½λœ 것을 μΈμ§€ν•˜κ³  μ§€μ •λœ λ™μž‘μ„ μ‹€ν–‰


νƒ€μž… μΊμŠ€νŒ…

: λ³€μˆ˜λ‚˜ 객체의 νƒ€μž…μ„ λ‹€λ₯Έ νƒ€μž…μœΌλ‘œ λ³€ν™˜ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€

νƒ€μž…μ΄λž€?

  • κΈ°λ³Έ 데이터 νƒ€μž…(Int, Double, Bool, String) λ“±
  • μ˜΅μ…”λ„(Optional)
  • μ»€μŠ€ν…€ 데이터 νƒ€μž…(struct, class, enum, protocol λ“±)
// Person은 슈퍼 클래슀(λΆ€λͺ¨ 클래슀)
class Person {

}

// StudentλŠ” μ„œλΈŒ 클래슀(μžμ‹ 클래슀) - 상속받은 클래슀
class Student: Person {

}

// TeacherλŠ” μ„œλΈŒ 클래슀(μžμ‹ 클래슀) - 상속받은 클래슀
class Teacher: Person {

}

let person: Person = Person() - κ°€λŠ₯
let student: Student = Student() - κ°€λŠ₯
let student: Person = Student() - κ°€λŠ₯
let teacher: Person = Teacher() - κ°€λŠ₯

let person: Student = Person() - λΆˆκ°€λŠ₯
// λΆ€λͺ¨ 클래슀의 μΈμŠ€ν„΄μŠ€λ₯Ό μžμ‹ 클래슀 νƒ€μž…μœΌλ‘œ ν• λ‹Ήν•  수 μ—†μŒ

let student: Teacher = Student() - λΆˆκ°€λŠ₯
//Teacher와 Student 클래슀 κ°„μ˜ μ•„λ¬΄λŸ° 관계가 μ—†μŒ

is

νƒ€μž…μ„ μ²΄ν¬ν•˜λŠ” μ—°μ‚°μžλ‘œ, 비ꡐ κ²°κ³Όλ₯Ό bool νƒ€μž…μ„ λ°˜ν™˜

νƒ€μž… 체킹

let char: Character = "A"
 
print(char is Character)
// 좜λ ₯κ°’: true
print(char is String)   
// 좜λ ₯κ°’: false

as, as!, as?

μΈμŠ€ν„΄μŠ€μ˜ "νƒ€μž…"을 ν™•μΈν•˜κ±°λ‚˜,Β ν•΄λ‹Ή μΈμŠ€ν„΄μŠ€λ₯Ό 슈퍼 클래슀(λΆ€λͺ¨ 클래슀)λ‚˜ ν•˜μœ„ 클래슀(μžμ‹ 클래슀)둜 μ·¨κΈ‰ν•˜λŠ” 방법

as

  • 컴파일 λ‹¨κ³„μ—μ„œ μΊμŠ€νŒ…μ΄ μ‹€ν–‰, λ”°λΌμ„œ 항상 νƒ€μž… μΊμŠ€νŒ…μ΄ 성곡할 κ²½μš°μ—λ§Œ μ‚¬μš©ν•  수 있음
  • μΊμŠ€νŒ…μ— μ‹€νŒ¨ν•  경우 μ—λŸ¬κ°€ λ°œμƒ
  • μΊμŠ€νŒ…ν•˜λ €λŠ” νƒ€μž…μ΄ 같은 νƒ€μž… μ΄κ±°λ‚˜ 슈퍼클래슀 νƒ€μž…μ΄λΌλŠ” 것을 μ•Œ λ•ŒΒ asΒ μ—°μ‚¬μžλ₯Ό μ‚¬μš©

as?

  • λŸ°νƒ€μž„μ— μΊμŠ€νŒ…μ΄ μ‹€ν–‰
  • μ„±κ³΅ν•˜λ©΄ μ˜΅μ…”λ„ νƒ€μž…μ˜ μΈμŠ€ν„΄μŠ€λ₯Ό λ°˜ν™˜ν•˜κ³ , μ‹€νŒ¨ν•˜λ©΄Β nil 을 λ°˜ν™˜
  • μ‹€νŒ¨ν•  κ°€λŠ₯성이 있으면 as?λ₯Ό μ‚¬μš©

as!

  • λŸ°νƒ€μž„μ— νŠΉμ • νƒ€μž…μœΌλ‘œ κ°•μ œ μΊμŠ€νŒ…
  • κ°•μ œ νƒ€μž… μΊμŠ€νŒ…μ— μ‹€νŒ¨ν•  경우, λŸ°νƒ€μž„ μ—λŸ¬κ°€ λ°œμƒν•  수 있음
class Person {
    var id = 0
    var name = "name"
    var email = "hgk@gmail.com"
}

class Worker: Person {
    // id
    // name
    // email
    var salary = 300
}

class Programmer: Worker {
    // id
    // name
    // email
    // salary
    var lang = "Swift"
}


// μ—…μΊμŠ€νŒ… - as
let person1 = Person()
let worker1 = Worker()
let programmer1 = Programmer()

let personList = [person1, worker1, programmer1] 
// νƒ€μž…μ„ μ„ μ–Έν•˜μ§€ μ•Šμ•˜μ§€λ§Œ Person νƒ€μž…μœΌλ‘œ 인식 -> 즉 μ—…μΊμŠ€νŒ…μ΄ λ˜μ—ˆμŒ
personList[1].name
//personList[1].salary -> Person νƒ€μž…μœΌλ‘œ 보고 있기 λ•Œλ¬Έμ— salary에 μ ‘κ·Όν•˜μ§€ λͺ»ν•¨

let worker2 = Worker()
worker2.salary

let workerPerson = worker2 as Person
//workerPerson.salary -> Person νƒ€μž…μœΌλ‘œ 보고 있기 λ•Œλ¬Έμ— salary에 μ ‘κ·Όν•˜μ§€ λͺ»ν•¨


// λ‹€μš΄μΊμŠ€νŒ… - as? / as!
// as?
let pro = programmer1 as? Programmer -> νƒ€μž… λ³€ν™˜μ΄ 될 μˆ˜λ„ 있고 μ•ˆλ  μˆ˜λ„ 있기 λ•Œλ¬Έμ— μ˜΅μ…”λ„μ„ 리턴

if let person2 = programmer1 as? Programmer {
    person2.lang
}

if let person3 = worker1 as? Programmer {
    person3.lang
}

// as!
let pro2 = worker2 as! Programmer // Error : νƒ€μž… λ³€ν™˜ μ‹€νŒ¨μ‹œ 였λ₯˜

λ‚˜λ¨Έμ§€ λ‚΄μš©μ€ 내일 정리해보겠닀!

0개의 λŒ“κΈ€