๐ŸŽ iOS/Swift

[Swift] Protocols | Delegate๋ฅผ ์‚ด์ง ๊ณ๋“ค์ธ

ํ”„๋กœํ† ์ฝœ์ด๋ž€?

  • ํ”„๋กœํ† ์ฝœ: ์ตœ์†Œํ•œ์œผ๋กœ ๊ฐ€์ ธ์•ผํ•  ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํ•ด๋‹น Object๊ฐ€ task๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜๋“œ์‹œ ๊ตฌํ˜„ํ•ด์•ผํ•˜๋Š” ๊ฒƒ์„ ์ •์˜ํ•ด์ค€๋‹ค. Java์˜ interface์™€ ๋น„์Šทํ•œ ์—ญํ• ์„ ํ•œ๋‹ค.
  • protocol์€ ์„ ์–ธ์ด๊ณ , type์—์„œ ๊ตฌํ˜„ํ•ด์ค˜์•ผํ•œ๋‹ค.

 

ex1) Swift์—์„œ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœํ† ์ฝœ ์˜ˆ์‹œ ์ค‘ ํ•˜๋‚˜์ธ CustomStringConvertible์„ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ

์‚ฌ์šฉ์ž๊ฐ€ ์ง€์ •ํ•œ ํ‹€๋Œ€๋กœ class๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

var greeting = "Hello, playground"

class person: CustomStringConvertible {
    
    let name: String
    let age: Int
    let isFemale: Bool
    
    init(name: String, age: Int, isFemale: Bool) {
        self.name = name
        self.age = age
        self.isFemale = isFemale
    }
    
    var description: String {
        return "Person (name: \(name), age: \(age), isFemale: \(isFemale))"
    }
}

let Jedi = person(name: "Jedi", age: 25, isFemale: true)
let Joshua = person(name: "Joshua", age: 28, isFemale: false)

print(Jedi) // Person (name: Jedi, age: 25, isFemale: true)

 

ex2) Swift์—์„œ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœํ† ์ฝœ ์˜ˆ์‹œ ์ค‘ ํ•˜๋‚˜์ธ Equatable ์„ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ

Equatable์„ ์‚ฌ์šฉํ•˜๋ฉด ์•„๋ž˜ ์˜ˆ์‹œ์ฒ˜๋Ÿผ '==' ์—ฐ์‚ฐ์ž๋ฅผ Customํ•˜์—ฌ ์›ํ•˜๋Š” ๋Œ€๋กœ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค!

struct Customer: Equatable {
    var name: String
    var phoneNumber: String
    var birthDay: String
    
    // phoneNumber๊ฐ€ ๊ฐ™์œผ๋ฉด ๊ฐ™์€ ์ธ๋ฌผ์ž„
    static func ==(lhs: Customer, rhs: Customer) -> Bool{
        return lhs.phoneNumber == rhs.phoneNumber
    }
}

let customer1 = Customer(name: "Jedi1", phoneNumber: "010123456789", birthDay: "20220225")
let customer2 = Customer(name: "jedi2", phoneNumber: "010123456789", birthDay: "19000225")

if customer1 == customer2 {
    print("Same Customer")
}else{
    print("Different Customer")
}

// ์ถœ๋ ฅ: Same Customer

 

ex3) Swift์—์„œ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœํ† ์ฝœ ์˜ˆ์‹œ ์ค‘ ํ•˜๋‚˜์ธ Codable ์„ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ

struct๋ฅผ Alamofire๋‚˜ URLsession ์‚ฌ์šฉ ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” json ํ˜•์‹์œผ๋กœ ๋งž์ถฐ์ค„ ์ˆ˜ ์žˆ๋‹ค.

import Foundation

struct Customer: Equatable, Codable {
    var name: String
    var phoneNumber: String
    var birthDay: String

}

let customer1 = Customer(name: "Jedi1", phoneNumber: "010123456789", birthDay: "20220225")

let jsonEncoder = JSONEncoder()

if let jsonData = try? jsonEncoder.encode(customer1), let jsonString = String(data: jsonData, encoding: .utf8){
    print(jsonString)
}

 

์ด๋ ‡๊ฒŒ Swift์—์„œ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœํ† ์ฝœ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๊ฐœ๋ฐœ์ž๊ฐ€ ์Šค์Šค๋กœ ํ”„๋กœํ† ์ฝœ์„ ๋งŒ๋“ค์–ด ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

Delegation

  • delegation: ํด๋ž˜์Šค์™€ ๊ตฌ์กฐ์ฒด๊ฐ€ ํ•ด์•ผํ•  ์ผ ์ค‘ ์ผ๋ถ€๋ฅผ ๋‹ค๋ฅธ ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋กœ ์œ„์ž„(delegate)ํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ด๋‹ค.
  • ์œ„์ž„์„ ํ•  ๋•Œ ํ•˜๋Š” '์•ฝ์†'์„ ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด ๊ตฌํ˜„ํ•œ๋‹ค.

Delegate๋Š” ์‚ฌ์‹ค ์ง์ ‘ UIkit์— ์ ์šฉํ•ด์„œ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์‹œ์™€ ํ•จ๊ป˜ ๋Œ์•„์˜ค๊ฒ ์Šต๋‹ˆ๋‹ค ์ด์ด..