edwith를 통해 스탠포드대학의 ios강의를 번역자막을 보면서 시청할수있다. 해당 강의를 시청하며 정리한 내용을 적어보려고 한다. 


what's in ios?

ios에 대한 간략한 설명을 해보자면 초기의 os X for iphone에서 3버전에는 iphone os, 2010년 4버전이 나오면서 ios라는 이름으로 정착되었다. ios는 크게 cocoa touch, media, core service, 

core OS로 구분되어 사용자와 하드웨어간의 의사소통을 담당한다.

 

사용자

cocoa touch

media

core service

core OS

하드웨어

 

cocoa touch는 전반적인 ui를 담당한다. 버튼, 슬라이더, 맵킷, 카메라 등 사용자와 가장 가까운 부분의 처리를 수행한다.

media는 말 그대로 비디오, 오디오, 이미지 등 ios의 미디어 부분을 할당한다. 

core service는 core location, network와 같은 핵심적인 서비스를 담당한다. 

core OS는 BSD계열 unix로 구성되어있으며, 당연하게도 c언어 베이스이다. 

 

해당 강의에서는 cocoa touch와 core service에 대해 다룰 예정이다.


Demo

이번 강의에 대한 카드뒤집기 데모를 만들었다. 

import UIKit


class ViewController: UIViewController {
    //카드를 뒤집은 수를 나타내는 레이블.
    @IBOutlet weak var flipCountLabel: UILabel!
    
    //flipCountLabel에 표시할 변수. 당연하게도 0부터 시작한다.
    var flipCount = 0 {
        //변수의 값 변동이 일어날 때마다 수행되는 메소드. flipCountLabel에 변경된 값을 전달하고 표시한다.
        didSet{
            flipCountLabel.text = "flipCount: \(flipCount)"
        }
    }
    
    //카드를 뒤집는 함수. 카드에 그려질 이모티콘(문자열)과 어떤 카드에 그릴지 UIButton을 매개변수로 받는다.
    func flipCard(withEmoji emoji:String, on button:UIButton) {
        if button.currentTitle == emoji{
            //카드가 앞면일 경우. 카드의 현재 문양(currentTitle)과 배개변수로 받은 이모티콘이 같다.
            button.setTitle("", for: UIControl.State.normal)
            button.backgroundColor =  colorLiteral(red: 1, green: 0.5763723254, blue: 0, alpha: 1)
        } else{
            //카드가 뒷면일 경우. 카드에 배개변수로 받은 이모티콘을 그리고(setTitle) 배경을 흰색으로, flipCount를 증가시킨다.
            button.setTitle(emoji, for: UIControl.State.normal)
            button.backgroundColor =  colorLiteral(red: 1, green: 1, blue: 1, alpha: 1)
            //flipCount가 증가되면 didSet이 수행된다.
            flipCount += 1
        }
    }
    
    //UIButton을 카드모양으로 배치하였다. 해당 카드들을 배열로 담았다.
    @IBOutlet var cards: [UIButton]!
    
    //카드에 그려넣을 그림을 이모티콘으로 표현한다. 배열로 담았다.
    let emojis = ["🐶","🦊","🐶","🦊"]
    
    //사용자가 카드를 터치할 때의 이벤트 함수. 어떤 카드가 터치된건지 UIButton을 매개변수로 넘긴다.
    @IBAction func touchCard(_ sender: UIButton) {
        if let cardNumber = cards.firstIndex(of: sender){
            //sender 즉 사용자가 터치한 카드가 cards배열에 몇번째 배열인지 반환한다.
            //해당 카드와 같은 배열번호의 이모지를 배개변수로 넘겨 flipCard()함수 수행.
            flipCard(withEmoji: emojis[cardNumber], on: sender)
        } else{
            //만약 카드가 cards배열에 없다면 오류문 출력
            print("card is not in cardsArray")
        }
    }
}

여기서 인상깊었던 부분은 함수부분이다. 처음 스위프트를 배울 때 함수선언부분에서 왜 매개변수명을 굳이 두개나 적을까 궁금했는데, 새touchCard()flipCard() 호출부분을 보면 스위프트가 어째서 매개변수명을 두개로 적는지 알 수 있었다. 애플은 코드를 읽을 때 최대한 사람의 입장에서 자연스럽게 코드를 읽을 수 있기를 바랬고, 그러한 의도가 호출부에서 잘 나타났다.

 

flipCard(withEmoji: emojis[cardNumber], on : sender) -> 전달자에 들어있는 이모지가 그려진 카드를 뒤집어라. 

 

반대로 선언부에서는 withemojion이라는 변수명이 부자연스러우니 emojibutton이라는 변수명으로 사용이 된다. 이러한 변수명의 선택은 코드의 유지보수면에서 큰 도움이 된다고 생각한다. 강의를 많이 찾아본 것은 아니지만 적어도 학원강의에서는 이러한 부분을 전혀 알려주지 않았던 것을 보면 확실히 본토 대학강의가 훨씬 더 영양가있다고 생각한다.

 

이번에 didSet{ }에 대해서도 처음 배웠다. 속성감시자라고 번역이 되어있는데, 우리가 알고있는 변수는 스위프트에서 속성이라 부른다고 한다. 속성(변수)값이 변경될 경우 항상 수행되는 작업을 명시해줄 수 있다. 해당 데모에서 flipCount를 증가할 때 마다 레이블 수정작업을 따로 적을 필요없이 didSet{ }에 레이블 수정작업을 적어주어 코드라인을 줄일 수 있게 되었다.

 

 

'iOS > Stanford' 카테고리의 다른 글

day06_multiTouch  (0) 2022.03.26
day05_view  (0) 2021.12.30
day04_swift_part2  (0) 2021.10.25
day03_swift_part1  (0) 2021.10.12
day02_MVC  (0) 2021.10.03

+ Recent posts