SSAC_iOS_Day 14 | TIL
👩💻 カリキュラムと追加学習
📂 Protocol
Property Requirements
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 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を使うのがずっと便利です.
Also create XIB file
をチェックしてXIBファイルを生成します. class DefaultTableViewCell: UITableViewCell {
static let identifier = "DefaultTableViewCell"
@IBOutlet var iconImageView: UIImageView!
@IBOutlet var titleLabel: UILabel!
}
static let identifier = "DefaultTableViewCell"
を記述することにより、tableViewControlクラス内のPropertyを利用して、tableViewControllerに直接識別子を記述するのではなく、tableViewCellクラス内のPropertyを利用することができる.let nibName = UINib(nibName: DefaultTableViewCell.identifier, bundle: nil)
setttingTableView.register(nibName, forCellReuseIdentifier: DefaultTableViewCell.identifier)
📂 その他
UserDefaultは、最初は「設定」などの簡単な情報を格納するための機能です.
したがって、私たち自身が作成して使用するstructやclassには、ストレージには適していません.
UserDefaultは、情報を格納するプロセスを
요청 ➡️ Struct ➡️ Data ➡️ Plist
の順序で行う.基本資料型では、構造基準データに変換するコードが用意されているため、追加の変換コードを記述する必要はありません.ただしstruct/classでは変換コードは用意されていないため,直接変換コードを記述する必要がある.前回はsaveData、loadDataコードで実現しました.
これらの過程を経ずにstruct/classを保存したい場合、
NSKeyedArchiver
を使用できるという.(後で勉強)ファイルの削除
Move to trash vs Remove Reference
:ごみに移動することをお勧めします.
参照のみを削除した場合、ファイルは完全に削除されませんので、Xcodeプロジェクトのリストに表示されているファイルのみを削除します.ファイルを削除するのではなく、Xcodeプロジェクトのリストに表示されているファイルのみを削除します.同じ名前のsweetファイルを後で追加すると、問題が発生する可能性があります.
ファイルの追加
Destination, Create folder references
:外部でファイルを追加する場合は、「必要に応じてプロジェクトをコピー」、「グループの作成」、「ターゲットに追加」の3つのオプションを選択します.
ファイルを参照として追加すると、その後ファイルを削除するとXcodeもファイルを削除し、ファイルが見つからず構築できなくなります.
Mainシーケンスイメージボードでは、referenceの前にnavigationcontrollerを埋め込むと便利です.
移動するシーケンスイメージボードファイルに埋め込むことはできますが、シーケンスイメージボードでtab barアイコンを直接変更したい場合は、Mainシーケンスイメージボードに埋め込むことができます!
👩💻 Mission
📂 Protocol Oriented Programming in Swift
Reference
この問題について(SSAC_iOS_Day 14 | TIL), 我々は、より多くの情報をここで見つけました https://velog.io/@hope1053/SSACiOSDay-14-TILテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol