์์ ๋ฃ๊ณ ์์ดํจ๋์๋ ์๊ฐ์ด๋ ๋ด์ฉ๋ค ๋ค ๊ธฐ๋กํด๋๋๋ฐ, ์ด๊ฑธ ์ปดํจํฐ๋ก ์ฎ๊ธฐ๋ ๊ฒ ์ ์ด๋ฆฌ ํ๋ ๊ฑด์ง.. ๊ทธ๋ ๋ค๊ณ ๋ฐ๋ก ์ปดํจํฐ์ ์ ์๋ ์ด์ํ๊ณ .. ์ข ๋ ๋ ธ๋ ฅํด๋ด์ผ๊ฒ ์ด์.. ๋ฐ๋ฆฐ TIL ์ ๋ก๋ ํด๋ณผ๊ฒ์! ใ ใ
Protocol(ํ๋กํ ์ฝ)
- ํ๋กํ ์ฝ์ ๊ท์น์ด๋ค.
- ์ค์ง์ ์ธ ๊ตฌํ์ ๋ด๋นํ์ง๋ ์๋๋ค.
- ๊ตฌํ์ ํ๋กํ ์ฝ์ ์ฑํํ ์ชฝ์์ ๋ด๋นํ๋ค.
๊ฐ์ฅ ํฐ ์ฅ์ ์ค ํ๋๊ฐ ํํ๋ฅผ ๊ฐ์ ํ ์ ์๋ค๋ ๋ถ๋ถ์ด๋ค. ํ์ผ๋ง๋ค ์์ฑํด์ผ ํ๋ ๋ฉ์๋ ๋ช ์ด๋ ํ๋กํผํฐ ๋ช ๋๋ ๊ตฌํ๋์ด์ผ ํ๋ ๋ถ๋ถ์ ๋ํ ๊ฐ์ ๋ฅผ ํ ์ ์๋ค๋ ๊ฒ์ด๋ค. ์ผ๊ด์ ์ธ ํํ๋ฅผ ์ ์งํ ๋ ์ ์ฉํ๋ค.
ํ๋กํ ์ฝ๊ณผ ๋ถ๋ชจ ํด๋์ค์ ๊ฐ์ฅ ํฐ ์ฐจ์ด๋ผ๊ณ ํ๋ค๋ฉด ํด๋์ค๋ ๋จ์ผ ์์๋ง ๊ฐ๋ฅํ ๋ฐ๋ฉด์, ํ๋กํ ์ฝ์ ๋ค์ค ์ฑํ์ด ๊ฐ๋ฅํ๋ค๋ ์ ์ด๋ค. ๋ค์ ๊ธ Taehyeon-Kim/TIL#98 ์ ๋ณด๊ณ ์จ๋ค๋ฉด ํ๋กํ ์ฝ์ ์ ์ฌ์ฉํ๋ฉด ์ข์์ง์ ๋ํ ๊ฐ์ ์กฐ๊ธ ์ก์ ์ ์์ง ์์๊น ์ถ๋ค. ํ๋กํ ์ฝ์ ์ฌ์ฉ์ ๋ค์ค ์์์ด ์๋๋ ํ๊ณ๋ฅผ ๊ทน๋ณตํ ์ ์๋ ์ข์ ์๋จ์ด ๋ ์ ์๋ค.
ํ๋กํ ์ฝ ๋ฉ์๋
- ํ๋กํ ์ฝ์์๋ ๋ฉ์๋๋ฅผ ์ ์ธ๋ง ํ๊ณ ์ค์ ๋ก ๊ตฌํํ์ง ์๋๋ค.
- ์ด๋ฅผ ๊ทน๋ณตํ๊ธฐ ์ํด Protocol Extension์ ์ฌ์ฉํ ์ ์๋ค. (Protocol Default Implementation ๊ฐ๋ ์ฐธ๊ณ ํ๊ธฐ)
- ์ธ์คํด์ค ๋ฉ์๋, ํ์ ๋ฉ์๋๋ฅผ ๋ชจ๋ ์ ์ํ ์ ์๋ค.
ํ๋กํ ์ฝ ํ๋กํผํฐ
- ํ๋กํผํฐ๋ ๊ตฌํ๋ถ์์ ์ ์ฅ, ์ฐ์ฐ ํ๋กํผํฐ ์ด๋ค ํํ๋ก๋ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. ๊ทธ ๋ง์ธ ์ฆ์จ ํน์ ํ๋กํผํฐ์ ํํ๋ฅผ ๋ช ์ํ์ง ์๋๋ค.
- gettable, settable ํ์ง๋ง ๋ช ์ํ๋ค.
์ต์ ๋ ํ๋กํ ์ฝ
ํ๋กํ ์ฝ์์ ๋ฉ์๋์ ํ๋กํผํฐ๋ฅผ ์ ์ํ๊ณ ๊ตฌํ๋ถ์์ ์ฑํํ๊ฒ ๋๋ฉด ๋ฐ๋์ ๋ชจ๋ ๋ด์ฉ์ ๊ตฌํํด์ผ ํ๋ค. ๊ทธ๋ฌ๋ ๊ทธ๋ฌ๊ณ ์ถ์ง ์์ ๊ฒฝ์ฐ๋ ๋ถ๋ช ์ด ์์ ๊ฒ์ด๋ค. ๊ทธ๋ด ๋ ์ ํ์ ์์ฒญ(Optional Requirement)์ ํ ์ ์๋ค. ๋จ, ํด๋์ค์์๋ง ์ ํ์ ์์ฒญ ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค.
protocol Example: AnyObject {
func method1()
@objc optional func method2() -> Bool
}
iOS Framework์์์ ํ๋กํ ์ฝ
- CaseIterable
- Hashable
- Collection
- ...
์ฝ๋ ์กฐ๊ฐ
let numberList: [Int] = Array(1...1025).reversed()
inputView
var inputView: UIView? { get set }
textField๊ฐ first responder๊ฐ ๋์์ ๋ ๋ณด์ฌ์ง ์ปค์คํ ๋ทฐ
UITextView
- UITextView๋ ๊ธฐ๋ณธ์ ์ผ๋ก placeHolder๋ฅผ ๊ฐ์ง๊ณ ์์ง ์๋ค. ๊ทธ๋ ๊ธฐ์ ์ง์ ๋ง๋ค์ด์ผ ํ๋ค.
- UITextField์ ๊ฐ์ฅ ํฐ ์ฐจ์ด๋ UITextField์ ๊ฒฝ์ฐ UIControl์ ์์๋ฐ๊ณ ์๊ณ , UITextView๋ UIView๋ฅผ ์์๋ฐ๊ณ ์๋ค๋ ์ ์ด๋ค.
- ์ TextView๋ DataSource๊ฐ ์๊ณ Delegate๋ง ๊ฐ์ง๊ณ ์์๊น?
UIPickerView, DataSource, Delegate
- extension์ผ๋ก ๋ถ๋ฆฌํด์ ์์ฑ (๊ฐ๋ ์ฑ๊ณผ ๋ถ๋ฆฌ)
- ๋ทฐ ๊ฐ์ฒด๋ง๋ค ํ์ํ Delegate๋ฅผ ๋ถ๋ฆฌํด์ ์์ฑํ๋ ํธ
extension UIPickerView: UIPickerViewDelegate {}
extension UIPickerView: UIPickerViewDataSource {}
WKWebView
- webView ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด์ UI๋ฅผ ๊ตฌ์ฑํ๋ค.
- URL๋ก ์ ์ ํ๊ฒ ํต์ ์ ์์ฒญํ๋ค.
func openWebPage(urlString: String) {
// ์ ํจํ URL์ธ์ง ํ์ธ
guard let url = URL(string: urlString) else {
print("Invalid URL")
return
}
let request = URLRequest(url: url)
webView.load(request)
}
WebView ๊ฐ์ฒด๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ธฐ๋ณธ ๋ฉ์๋๊ฐ ๋ง๋ค. ๋ค๋ก ๊ฐ๊ธฐ, ์๋ก ๊ณ ์นจ, ์์ผ๋ก ๊ฐ๊ธฐ ๋ฑ์ด ์์๋ค.
// ์ฑ ์ธ๋ถ๋ก ๋งํฌ ์ฐ๊ฒฐ
@IBAction func openExternalLinkButtonTapped(_ sender: UIBarButtonItem) {
Utils.openExternalLink(urlString: "https://www.netflix.com")
}
// ๋ค๋ก ๊ฐ๊ธฐ
@IBAction func goBackButtonClicked(_ sender: UIBarButtonItem) {
if webView.canGoBack {
webView.goBack()
}
}
// ์๋ก ๊ณ ์นจ
@IBAction func reloadButtonClicked(_ sender: UIBarButtonItem) {
webView.reload()
}
// ์์ผ๋ก ๊ฐ๊ธฐ
@IBAction func gorForwardButtonClicked(_ sender: UIBarButtonItem) {
if webView.canGoForward {
webView.goForward()
}
}
์ฑ ๋ด๋ถ ๋ง๊ณ ์ธ๋ถ์์ ๋งํฌ๋ฅผ ๋์ฐ๊ณ ์ถ์ด์ Util ์ฝ๋๋ฅผ ์ข ์ฐพ์๋ดค๋ค. ๋ณ ๊ฒ์ ์์๋ค. ๊ทธ๋ฅ UIApplication ๊ฐ์ฒด์์ ๋ฐ๋ก URL์ ์ฌ๋ ํ์์ธ ๊ฒ ๊ฐ๋๋ผ.
import UIKit
class Utils {
static func openExternalLink(urlString: String, _ handler: (() -> Void)? = nil) {
guard let url = URL(string: urlString) else { return }
UIApplication.shared.open(url, options: [:]) { _ in
handler?()
}
}
}
'๐ฑ SeSAC' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SeSAC] 220801 TIL (0) | 2022.08.10 |
---|---|
[SeSAC] 220729 TIL (0) | 2022.08.10 |
[SeSAC] 220727 TIL (0) | 2022.08.03 |
[SeSAC] 220726 TIL (2) | 2022.07.26 |
[SeSAC] 220725 TIL (0) | 2022.07.26 |