[SeSAC] 220728 TIL

2022. 8. 6. 21:54ยท๐ŸŒฑ SeSAC
๋ชฉ์ฐจ
  1. Protocol(ํ”„๋กœํ† ์ฝœ)
  2. ํ”„๋กœํ† ์ฝœ ๋ฉ”์„œ๋“œ
  3. ํ”„๋กœํ† ์ฝœ ํ”„๋กœํผํ‹ฐ
  4. ์˜ต์…”๋„ ํ”„๋กœํ† ์ฝœ
  5. iOS Framework์—์„œ์˜ ํ”„๋กœํ† ์ฝœ
  6. ์ฝ”๋“œ ์กฐ๊ฐ
  7. inputView
  8. UITextView
  9. UIPickerView, DataSource, Delegate
  10. WKWebView
์ˆ˜์—… ๋“ฃ๊ณ  ์•„์ดํŒจ๋“œ์—๋Š” ์ƒ๊ฐ์ด๋‚˜ ๋‚ด์šฉ๋“ค ๋‹ค ๊ธฐ๋กํ•ด๋†“๋Š”๋ฐ, ์ด๊ฑธ ์ปดํ“จํ„ฐ๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒŒ ์™œ ์ด๋ฆฌ ํž˜๋“  ๊ฑด์ง€.. ๊ทธ๋ ‡๋‹ค๊ณ  ๋ฐ”๋กœ ์ปดํ“จํ„ฐ์— ์ ์ž๋‹ˆ ์–ด์ƒ‰ํ•˜๊ณ .. ์ข€ ๋” ๋…ธ๋ ฅํ•ด๋ด์•ผ๊ฒ ์–ด์š”.. ๋ฐ€๋ฆฐ 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

  1. webView ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ UI๋ฅผ ๊ตฌ์„ฑํ•œ๋‹ค.
  2. 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
  1. Protocol(ํ”„๋กœํ† ์ฝœ)
  2. ํ”„๋กœํ† ์ฝœ ๋ฉ”์„œ๋“œ
  3. ํ”„๋กœํ† ์ฝœ ํ”„๋กœํผํ‹ฐ
  4. ์˜ต์…”๋„ ํ”„๋กœํ† ์ฝœ
  5. iOS Framework์—์„œ์˜ ํ”„๋กœํ† ์ฝœ
  6. ์ฝ”๋“œ ์กฐ๊ฐ
  7. inputView
  8. UITextView
  9. UIPickerView, DataSource, Delegate
  10. WKWebView
'๐ŸŒฑ SeSAC' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [SeSAC] 220801 TIL
  • [SeSAC] 220729 TIL
  • [SeSAC] 220727 TIL
  • [SeSAC] 220726 TIL
taeeekki
taeeekki
๐ŸŒฑiOS ๊ฐœ๋ฐœ์ž๋ฅผ ๊ฟˆ๊พธ๋Š” ํ•™์ƒ์ด ๋งŒ๋“œ๋Š” ๋ธ”๋กœ๊ทธ
taeeekki
taekki.dev
taeeekki
์ „์ฒด
์˜ค๋Š˜
์–ด์ œ
  • All (130)
    • ๐ŸŒฑ SeSAC (40)
    • โ˜€๏ธ 100DaysOfSwift (18)
    • ๐ŸŽ iOS & Swift (60)
    • ๐Ÿ“ฉ Essay (3)
    • ๐ŸŽ Tip (4)
    • ๐ŸŒˆ UIUX (2)
    • ๐Ÿง OOP (1)
    • ๐Ÿฅณ Side Project (0)
    • โœจ Problem Solving (1)
    • ๐Ÿ“ Note (1)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ
  • ํƒœ๊ทธ
  • ๋ฐฉ๋ช…๋ก

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

commit
swift
์Šค์œ„ํ”„ํŠธ
์Šค์œ„ํ”„ํŠธ๋ฌธ๋ฒ•
๊ฐœ๋ฐœ
Realm
TIL
GIT
์˜ค์˜คํˆฌ๋‘
iOS H.I.G
tableView
100DaysOfSwift
IOS
iOS UIUX
URLSession
์Šค์œ„ํ”„ํŠธ ๋ฌธ๋ฒ•
CollectionView
๊ฐœ์ธ ์•ฑ ์ถœ์‹œ
github
OOTD
PageViewController
์†ํŠธ
iOS ์•ฑ ์ถœ์‹œ
SeSAC
Diary App
์˜ต์…”๋„
ํด๋กœ์ €
github tip
network
๊นƒํ—ˆ๋ธŒ

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

hELLOยท Designed By์ •์ƒ์šฐ.v4.5.3
taeeekki
[SeSAC] 220728 TIL
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”

๋‹จ์ถ•ํ‚ค

๋‚ด ๋ธ”๋กœ๊ทธ

๋‚ด ๋ธ”๋กœ๊ทธ - ๊ด€๋ฆฌ์ž ํ™ˆ ์ „ํ™˜
Q
Q
์ƒˆ ๊ธ€ ์“ฐ๊ธฐ
W
W

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€

๊ธ€ ์ˆ˜์ • (๊ถŒํ•œ ์žˆ๋Š” ๊ฒฝ์šฐ)
E
E
๋Œ“๊ธ€ ์˜์—ญ์œผ๋กœ ์ด๋™
C
C

๋ชจ๋“  ์˜์—ญ

์ด ํŽ˜์ด์ง€์˜ URL ๋ณต์‚ฌ
S
S
๋งจ ์œ„๋กœ ์ด๋™
T
T
ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ ์ด๋™
H
H
๋‹จ์ถ•ํ‚ค ์•ˆ๋‚ด
Shift + /
โ‡ง + /

* ๋‹จ์ถ•ํ‚ค๋Š” ํ•œ๊ธ€/์˜๋ฌธ ๋Œ€์†Œ๋ฌธ์ž๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธฐ๋ณธ ๋„๋ฉ”์ธ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.