SSAC_iOS_Day 14 | TIL


👩‍💻 カリキュラムと追加学習


📂 Protocol

  • クラス、構造ベースの青写真
  • SWIFTのクラスは単一継承であり,他のクラスを継承することは不可能である.ただし、拡張が必要な場合にプロトコルを使用することもできます.
  • プロトコル内では実際の実施は行われていない.名前だけ明記!
  • Property Requirements

  • のタイプとget、setのみを明記します.
  • を計算プログラム/記憶プログラムとして使用するかどうかは重要ではありません.
  • protocol NavigationUIProtocol {
        var titleString: String { get set }
        var mainTintColor: UIColor { get }
    }
    
    class JackViewController: UIViewController, NavigationUIProtocol {
        var titleString: String = "나의 일기"
        var mainTintColor: UIColor = .black // get만 가능하다고 했는데 왜 set도 가능? -> get만 가능하다고 한 경우, get은 필수인데 set은 선택. 그니까 구현해도 ㄱㅊ음!!
        
        override func viewDidLoad() {
            super.viewDidLoad()
            
            title = titleString
            view.backgroundColor = mainTintColor
        }
    }
    
    class Jack2ViewController: UIViewController, NavigationUIProtocol {
        var titleString: String {
            get {
                return "나의 일기"
            }
            set {
                title = newValue
            }
        }
        var mainTintColor: UIColor {
            get {
                return .black
            }
            set {
                view.backgroundColor = newValue
            }
        }
        
        override func viewDidLoad() {
            super.viewDidLoad()
            
            titleString = "새로운 일기"
        }
    }

    Method Requirements

    protocol OrderSystem {
        func recommendEventMenu()
        func askStampcard(count: Int) -> String
    }
    
    class StarBucksMenu {
        
    }
    
    class Smoothie: StarBucksMenu, OrderSystem {
        func recommendEventMenu() {
            print("스무디 이벤트 안내")
        }
        
        func askStampcard(count: Int) -> String {
            return "\(count)잔 적립 완료"
        }
    }
    
    class Coffee: StarBucksMenu, OrderSystem { 
        func recommendEventMenu() {
            print("커피 이벤트 안내")
        }
        
        func askStampcard(count: Int) -> String {
            return "\(count * 2)잔 적립 완료"
        }
    }

    Optional Requirements


    optionalを使用するには@objcに記入する必要があります.
    @objc
    protocol 프로토콜이름 {
    	@objc optioanl func 메서드이름{}
    }

    Iniializer Requirements

  • 初期化文:構造体にメンバーワイルドカードがあっても、プロトコルを使用して初期化する必要があります(元の構造体は初期化文を必要としません!)
  • protocol OrderSystem {
        func recommendEventMenu()
        init()
    }
    
    class Smoothie: StarBucksMenu, OrderSystem {
        func recommendEventMenu() {
            print("스무디 이벤트 안내")
        }
        
        // 부모에서도 init이 있을 수 있기 때문에 구별을 위해서 required를 붙임
        required init() {
        }
    }

    AnyObjects


    プロトコルをクラスでのみ使用するように制限する場合は、AnyObjectを継承できます.このキーワードを作成するプロトコルはStructでは使用できません.
    protocol OrderSystem: AnyObject {
        func recommendEventMenu()
    }

    📂 Enumeration CaseIterable

  • Enumを利用すると,Table ViewのSectionTitleとRow Titleをコードに容易に適用できる.
  • enum SettingSection: Int, CaseIterable {
        case authorization
        case onlineShop
        case question
        
        var description: String {
            switch self {
            case .authorization:
                return "알림 설정"
            case .onlineShop:
                return "온라인 스토어"
            case .question:
                return "Q&A"
            }
        }
    }
    class SettingViewController: UIViewController {
        @IBOutlet var setttingTableView: UITableView!
        
        let settingList = [
            ["위치 알림 설정", "카메라 알림 설정"],
            ["교보 문고", "영풍 문고", "반디앤루니스"],
            ["앱스토어 리뷰 작성하기", "문의하기"]
        ]
        
        override func viewDidLoad() {
            super.viewDidLoad()
            
            setttingTableView.delegate = self
            setttingTableView.dataSource = self
    
            let nibName = UINib(nibName: DefaultTableViewCell.identifier, bundle: nil)
            setttingTableView.register(nibName, forCellReuseIdentifier: DefaultTableViewCell.identifier)
        }
        
    }
    extension SettingViewController: UITableViewDelegate, UITableViewDataSource {
        func numberOfSections(in tableView: UITableView) -> Int {
            // CaseIterable 프로토콜 사용해서 가능한 코드!
            return SettingSection.allCases.count
        }
        
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return settingList[section].count
        }
        
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            guard let cell = tableView.dequeueReusableCell(withIdentifier: DefaultTableViewCell.identifier, for: indexPath) as? DefaultTableViewCell else {
                return UITableViewCell()
            }
            
            cell.iconImageView.backgroundColor = .blue
            cell.titleLabel.text = settingList[indexPath.section][indexPath.row]
            
            return cell
        }
        
        func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
            return SettingSection.allCases[section].description
        }
    }

    📂 Pass Data Between ViewControllers

  • 画面から受信データを作成する空間
  • var movieData: Movie?
  • の値を受け取ると、画面(どこに使用するか表示)
  • に適用される.
    titleTextField.text = movieData?.title
    overviewTextView.text = movieData?.overview
  • 前画面転送値
  • override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
            let sb = UIStoryboard(name: "Movie", bundle: nil)
            
            let vc = sb.instantiateViewController(withIdentifier: "detailBoxOfficeViewController") as! detailBoxOfficeViewController
            
            let data = movieInformation.movie[indexPath.row]
            vc.movieData = data <<
            self.navigationController?.pushViewController(vc, animated: true)
        }
    ААААААААААААА

    📂 XIB

  • はモジュール化冗長ユニット設計を採用している.
    よく使われるデザインでは、XIBを使うのがずっと便利です.
  • Table View Cellファイルを作成すると同時に、Also create XIB fileをチェックしてXIBファイルを生成します.
  • に必要なUIコンポーネントを配置した後、自動レイアウトを設定します.また、InspectorウィンドウでReuse Identifierを設定することもできます.自動的に生成されるtableViewCellクラスに関連付けられているため、AssistanceでIBOUTを接続することもできます.
  • class DefaultTableViewCell: UITableViewCell {
        static let identifier = "DefaultTableViewCell"
        
        @IBOutlet var iconImageView: UIImageView!
        @IBOutlet var titleLabel: UILabel!
    }
  • tableViewCellクラスにコードstatic let identifier = "DefaultTableViewCell"を記述することにより、tableViewControlクラス内のPropertyを利用して、tableViewControllerに直接識別子を記述するのではなく、tableViewCellクラス内のPropertyを利用することができる.
  • let nibName = UINib(nibName: DefaultTableViewCell.identifier, bundle: nil)
            setttingTableView.register(nibName, forCellReuseIdentifier: DefaultTableViewCell.identifier)
  • ビューコントローラのViewDidLoad()メソッドでは、作成したXIBファイルをTableビューに登録して使用するには、上記のコードを記述する必要があります.
  • 📂 その他

  • Using UserDefaults to save Custom Struct or Class
    UserDefaultは、最初は「設定」などの簡単な情報を格納するための機能です.
    したがって、私たち自身が作成して使用するstructやclassには、ストレージには適していません.
    UserDefaultは、情報を格納するプロセスを요청 ➡️ Struct ➡️ Data ➡️ Plistの順序で行う.
    基本資料型では、構造基準データに変換するコードが用意されているため、追加の変換コードを記述する必要はありません.ただしstruct/classでは変換コードは用意されていないため,直接変換コードを記述する必要がある.前回はsaveData、loadDataコードで実現しました.
    これらの過程を経ずにstruct/classを保存したい場合、NSKeyedArchiverを使用できるという.(後で勉強)
  • Swift File remove/add
    ファイルの削除
    Move to trash vs Remove Reference
    :ごみに移動することをお勧めします.
    参照のみを削除した場合、ファイルは完全に削除されませんので、Xcodeプロジェクトのリストに表示されているファイルのみを削除します.ファイルを削除するのではなく、Xcodeプロジェクトのリストに表示されているファイルのみを削除します.同じ名前のsweetファイルを後で追加すると、問題が発生する可能性があります.
    ファイルの追加
    Destination, Create folder references
    :外部でファイルを追加する場合は、「必要に応じてプロジェクトをコピー」、「グループの作成」、「ターゲットに追加」の3つのオプションを選択します.
    ファイルを参照として追加すると、その後ファイルを削除するとXcodeもファイルを削除し、ファイルが見つからず構築できなくなります.
  • Storyboard References
    Mainシーケンスイメージボードでは、referenceの前にnavigationcontrollerを埋め込むと便利です.
    移動するシーケンスイメージボードファイルに埋め込むことはできますが、シーケンスイメージボードでtab barアイコンを直接変更したい場合は、Mainシーケンスイメージボードに埋め込むことができます!
  • 👩‍💻 Mission


    📂 Protocol Oriented Programming in Swift