Xcode 9 인것을 보고 백스텝 하고 싶었으나 일단 킹짱 교수님을 믿어보기로...
오늘은 1강이라 뭔가 사실상 글로서리와 같은 포스팅이 될 것 같다
+
버튼을 누르면 추가할 수 있는 UIControl 들이 뜬다 Outlet, Outlet Collection : 프로퍼티를 생성하고 해당 프로퍼티에 연결
Action 이나 Outlet 에 연결하면 코드에 @IBAction 혹은 @IBOutlet 같은 표기와 함께 브레이크포인트를 설정하는 부분에 동그란 원이 생기는데 그 위에 마우스를 갖다대면 스토리보드의 어떤 객체와 연결되어 있는 지 보여준다. 디폴트 타입이 Any 로 되어있는데 반드시 현재 연결하려는 객체의 타입으로 바꿔줘야 한다.
그 외에도 오브젝트 위에서 마우스 우클릭을 해서 관계를 설정/삭제할 수 있고, 아래 그림에서처럼 스토리보드의 맨 왼쪽 버튼을 눌러서도 설정할 수 있다.
버튼을 누르면 호출되는 메서드 즉, Action에 해당되며, 인자로 해당 메서드를 호출한 버튼을 넘겨 받는다. 그리고 touchCards 내부에서는 이제 버튼을 눌렀을 때 할 액션을 별도의 메서드( e.g.flipCard(withEmoji:on:))로 선언한다. 이게 은닉화인가?
cardButtons 는 버튼의 이모지를 찾기 위해 필요한 버튼들의 Collection 으로 마찬가지로 스토리보드와 연결된 Outlet 이다. 이 부분이 너무나 낯설었고...액션을 호출한 버튼을 넘겨받는데 그 안에 왜 이모지에 대한 정보는 포함되지 않았는지가 너무나 의문...나중에 짜잔 사실은 포함되어 있었답니다 하고 알려주시려나?
class ViewController: UIViewController {
...
@IBOutlet var cardButtons: [UIButton]!
private var emojiChoices = ["👻", "🎃", "🧙♀️", "🍭"]
@IBAction func touchCard(_ sender: UIButton) {
flipCount += 1
if let index = cardButtons.firstIndex(of: sender) {
flipCard(withEmoji: emojiChoices[index], on: sender)
} else {
print("chosen card was not in cardButtons")
}
}
private func flipCard(withEmoji emoji: String, on button: UIButton) {
if button.currentTitle == emoji {
button.setTitle("", for: .normal)
button.backgroundColor = .systemOrange
} else {
button.setTitle(emoji, for: .normal)
button.backgroundColor = .white
}
}
}
class ViewController: UIViewController {
@IBOutlet weak var flipCountLabel: UILabel!
private var flipCount = 0 {
didSet {
flipCountLabel.text = "Flips : \(flipCount)"
}
}
...
}
Optional 은 set / not set 의 2가지 상태를 가지며, set 인 경우 associated data 를 가진다
nil 은 not set 상태의 Optional 을 의미
차라리 코딩 막 입문했을 때나 최소한 SwiftUI 배우기 전에 했다면 오 코딩 아니고 게임같네 하면서 재밌게 했을수도...ㅋㅋㅋㅋㅋㅋㅋ
치지직...치지직...2017년의 index(of:) 는 이제 firstIndex(of:) 로 대체되었다...그리고 Color Literal 도 Xcode 13 부터 사라짐...
50:40 초
1:03 카드 뒤집는 법