๐ŸŒฑ SeSAC

[SeSAC] 220818 TIL

taeeekki 2022. 8. 20. 02:56

ํƒ€์ž… ํ™•์ธ

type(of: x)
type(of: value)

 


 

ํ˜• ๋ณ€ํ™˜ - ํƒ€์ž… ๋ณ€ํ™˜

  • ์ดˆ๊ธฐํ™” ๊ตฌ๋ฌธ ์‚ฌ์šฉ
  • ์ด๋‹ˆ์…œ๋ผ์ด์ € ๊ตฌ๋ฌธ์„ ํ†ตํ•ด์„œ ์ƒˆ๋กญ๊ฒŒ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ
let value = String(a)

 


 

ํƒ€์ž… ํ™•์ธ ์—ฐ์‚ฐ์ž is

  • ์–ด๋–ค ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค ํƒ€์ž…์ธ์ง€, ์–ด๋–ค ๋ฐ์ดํ„ฐ ํƒ€์ž…์ธ์ง€ ํ™•์ธํ•  ๋•Œ ์‚ฌ์šฉ
class Mobile {
   let name: String

    var introduce: String {
        return "\(name) ์ž…๋‹ˆ๋‹ค."
    }

    init(name: String) {
        self.name = name
    }
}

class Apple: Mobile {
    let wwdc = "WWDC22"
}

class Google: Mobile {}

mobile is Mobile
mobile is Apple
mobile is Google

apple is Mobile // ๋ถ€๋ชจ์˜ ๊ฒƒ์„ ์ƒ์†๋ฐ›์•˜๊ธฐ ๋•Œ๋ฌธ์— Mobile ํƒ€์ž…๋„ true
apple is Apple
apple is Google

 


 

Up/Down Casting(์—… ์บ์ŠคํŒ…, ๋‹ค์šด ์บ์ŠคํŒ…)

๋‹ค์šด ์บ์ŠคํŒ…(as?, as!)

  • ๋ถ€๋ชจ ํด๋ž˜์Šค ํƒ€์ž…์„ ์ž์‹ ํด๋ž˜์Šค ํƒ€์ž…์œผ๋กœ ๋‹ค์šดํ•ด์„œ ์บ์ŠคํŒ…
  • ์™œ ํ•˜๋ƒ? ์œ„์— ์„ ์–ธ๋œ ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋‚˜๋Š” Appleํด๋ž˜์Šค์˜ wwdc ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•˜๊ณ  ์‹ถ์€ ๊ฒƒ์ด๋‹ค. ๊ทผ๋ฐ ์ง€๊ธˆ์€ Mobile ํƒ€์ž…์œผ๋กœ ๋ช…์‹œ๋˜์–ด ์žˆ๋‹ค. ์ƒ์† ๊ด€๊ณ„๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉด ์—๋Ÿฌ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์ง€๋งŒ, Apple ํด๋ž˜์Šค์˜ ํ”„๋กœํผํ‹ฐ์—๋Š” ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๋‹ค์šด ์บ์ŠคํŒ…์„ ํ•ด์„œ ์ข€ ๋” ๋ฒ”์œ„๋ฅผ ์ขํ˜€์ค˜์•ผ ํ•œ๋‹ค.
let iphone: Mobile = Apple(name: "APPLE")
iphone.introduce // Mobile ํƒ€์ž…์ด๊ธฐ ๋•Œ๋ฌธ์— Mobile์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
iphone.wwdc       // ๊ทธ๋Ÿฌ๋‚˜ wwdc ํ”„๋กœํผํ‹ฐ์—๋Š” ์ง€๊ธˆ ๋‹น์žฅ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.
// ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋‹ค์šด ์บ์ŠคํŒ…(as? ์—ฐ์‚ฐ์ž ์ด์šฉ)์„ ํ•˜๋ฉด wwdc ํ”„๋กœํผํ‹ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
if let iphone = iphone as? Apple {
    print(iphone.wwdc)
} else {
    print("ํƒ€์ž… ์บ์ŠคํŒ… ์‹คํŒจ")
}

์—… ์บ์ŠคํŒ…(as)

  • ๋ช…ํ™•ํ•œ ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์บ์ŠคํŒ…์— ๋Œ€ํ•œ ์„ฑ๊ณต์„ ํ™•์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ as๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ถ€๋ชจ ํด๋ž˜์Šค์˜ ํƒ€์ž…์ธ ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์„ ๋•Œ as๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
apple as Mobile

Any/AnyObject

  • Any(๋ชจ๋“  ํƒ€์ž…์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋‹ด์„ ์ˆ˜ ์žˆ์Œ) vs AnyObject(ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋งŒ ๋‹ด์„ ์ˆ˜ ์žˆ์Œ)
  • ์ปดํŒŒ์ผ ์‹œ์ ์—์„  ์–ด๋–ค ํƒ€์ž…์ธ์ง€ ์•Œ ์ˆ˜ ์—†๊ณ , ๋Ÿฐํƒ€์ž„ ์‹œ์ ์— ํƒ€์ž…์ด ๊ฒฐ์ •๋œ๋‹ค.
  • Any๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๊ฒฐ๊ตญ ํƒ€์ž… ์บ์ŠคํŒ…์ด๋ผ๋Š” ๊ท€์ฐฎ์€ ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.
  • Any์˜ ์‚ฌ์šฉ์„ ์ง€์–‘ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.
var somethings: [Any] = []

somethings.append(0)
somethings.append(true)
somethings.append("something")
somethings.append(mobile)

// Any ์‚ฌ์šฉ ์‹œ ํƒ€์ž… ์บ์ŠคํŒ…์˜ ๊ณผ์ •์„ ๊ฑฐ์น  ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.
let example = somethings[1]

if var element = example as? String {
//    print(element.toggle())
    print(element)
} else {
    print("Bool ์•„๋‹˜")
}

 

protocol myCellDelegate: AnyObject {}
  • AnyObject๋ฅผ ์ด์šฉํ•ด์„œ ํด๋ž˜์Šค ์ œ์•ฝ์„ ์„ค์ •ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

 


 

Generic

์ฐธ๊ณ  ใ…Žใ…Ž, https://taekki-dev.tistory.com/26

  • ํƒ€์ž…์— ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•œ ์š”์†Œ์ด๋‹ค.
  • ํƒ€์ž…๊ณผ ๊ธฐ๋Šฅ์„ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์ข‹๊ณ , ์ฝ”๋“œ์˜ ์ค‘๋ณต๋„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

ํ™”๋ฉด ์ „ํ™˜ ์ฝ”๋“œ ๊ฐœ์„ 

  • ์Šคํ† ๋ฆฌ๋ณด๋“œ ์‚ฌ์šฉ์˜ ๊ฒฝ์šฐ
  • ์—ฌ๊ธฐ์„œ ํฌ์ธํŠธ๋Š” ์œ ์šฉํ•œ ์ฝ”๋“œ๋ฅผ ์–ป์—ˆ๋‹ค๊ฐ€ ์•„๋‹ˆ๋ผ ํ™”๋ฉด ์ „ํ™˜ ์ฝ”๋“œ๊ฐ€ ํ”„๋กœ์ ํŠธ์—์„œ ๋งŽ์ด ์ƒ๊ธฐ๊ฒŒ ๋˜๊ณ , ์ค‘๋ณต๋œ ์ฝ”๋“œ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด Generic ๊ฐœ๋…์„ ์ด์šฉํ–ˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋Ÿฐ ์‚ฌ๊ณ ๊ฐ€ ๋” ํ™•์žฅ๋˜์–ด์„œ Coordinator ํŒจํ„ด๋„ ๋“ฑ์žฅํ•˜๊ฒŒ ๋œ ๊ฒƒ ๊ฐ™๋‹ค.
func transitionViewController<T: UIViewController>(storyboard: String, viewController vc: T) {

    let storyboard = UIStoryboard(name: storyboard, bundle: nil)
    guard let controller = storyboard.instantiateViewController(withIdentifier: String(describing: vc)) as? T else { return }
    self.present(controller, animated: true)
}

ํ…Œ๋‘๋ฆฌ ์ ์šฉ ์ฝ”๋“œ ๊ฐœ์„ 

func configureBorder<T: UIView>(_ view: T) {
    view.layer.cornerRadius = 10
    view.layer.borderColor = UIColor.black.cgColor
    view.layer.borderWidth = 1
}

 


 

ํด๋กœ์ €๋ฅผ ์ด์šฉํ•œ ๊ฐ’ ์ „๋‹ฌ

  • A -> B๋กœ ํ™”๋ฉด ์ „ํ™˜ ๋˜๋Š” ๊ด€๊ณ„์—์„œ, B -> A๋กœ ๊ฐ’์„ ์ „๋‹ฌํ•  ๋•Œ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
// (A ํ™”๋ฉด) ViewController.swift

import UIKit

class ViewController: UIViewController {

    lazy var nameButton: UIButton = {
        let view = UIButton()
        view.setTitle("๋‹‰๋„ค์ž„", for: .normal)
        view.setTitleColor(UIColor.black, for: .normal)
        view.backgroundColor = .blue
        view.addTarget(self, action: #selector(nameButtonClicked), for: .touchUpInside)
        return view
    }()

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    @objc func nameButtonClicked() {
        let controller = ProfileViewController()
        controller.saveButtonActionHandler = { name in
            self.nameButton.setTitle(name, for: .normal)
        }
        present(controller, animated: true)
    }
}
// (B ํ™”๋ฉด) ProfileViewController.swift

import UIKit

class ProfileViewController: UIViewController {

    let saveButton: UIButton = {
        let view = UIButton()
        view.setTitle("์ €์žฅ", for: .normal)
        view.backgroundColor = .black
        view.addTarget(self, action: #selector(saveButtonClicked), for: .touchUpInside)
        return view
    }()

    var saveButtonActionHandler: ((String) -> ())?

    override func viewDidLoad() {
        super.viewDidLoad()
    }

    ...

    @objc func saveButtonClicked() {

        // ๊ฐ’ ์ „๋‹ฌ ๊ธฐ๋Šฅ ์‹คํ–‰ => ํด๋กœ์ € ๊ตฌ๋ฌธ ํ™œ์šฉ
        guard let text = nameTextField.text else { return }

        saveButtonActionHandler?(text)

        // ํ™”๋ฉด dismiss
        dismiss(animated: true)
    }
}