ํ์ ํ์ธ
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)
}
}
'๐ฑ SeSAC' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Diary App: DDAK] ๊ธฐ๋ก์ ์์ (0) (5) | 2022.08.23 |
---|---|
[SeSAC] 220819 TIL (0) | 2022.08.20 |
[SeSAC] 220817 TIL (0) | 2022.08.20 |
[SeSAC] 220816 TIL (0) | 2022.08.16 |
[SeSAC] 220812 TIL (0) | 2022.08.15 |