티스토리 뷰

간단하게 2주 차는,

  1. Swift 기본 문법 - 조건문, 반복문
  2. UI 컴포넌트로 연습 (포커 앱)
  3. Swift 심화 문법 - 옵셔널, 클래스, 구조체
  4. 타이머 앱

 

Swift 기본 문법 - 조건문, 반복문

var age = 30

if age > 20 {
    print("성인")
} else {
    print("청소년")
}


var fruitName = "사과"

if fruitName == "사과" {
    print("사과가 최고지")
} else if fruitName == "딸기" {
    print("딸기는 논산 딸기")
} else if fruitName == "수박" {
    print("여름은 역시 수박!")
} else {
    print("다른 과일들도 많지요~")
}

switch fruitName{
case "사과":
    print("사과가 최고지")
case "딸기":
    print("딸기는 논산 딸기")
default:
    print("다른 과일도 많지요~")
}

for i in 0..<100 {
    print(i)
}

for i in 0...100 {
    print(i)
}

var people = ["gildong","euna"]

for person in people{
    print(person)
}

for i in 0..<people.count{
    let person = people[i]
    print(person)
}

 

포커 카드 뒤집기 앱

 

isBackSide는 뒤집힌 상태를 저장하는 변수이다. '뒤집힌 상태에 따라 이미지를 넣어준다.

1주 차에서 시스템에서 제공하는 이미지로 바꿀 때는,

 UIImage(systemName: "flashlight.on.fill")

 

2주 차에서는 가져온 이미지로 바꿀 때는,

UIImage(named: "ace")

 

버튼을 눌렀을 때 카드 뒤집는 애니메이션 없이, 뒤집도록 하는 버전이다.

var isBackSide = true

@IBAction func buttonDidClick(_ sender: Any) {
    if isBackSide {
        imageView.image = UIImage(named: "ace")
    } else {
        imageView.image = UIImage(named: "poker")
    }
    isBackSide = !isBackSide
 }

 

애니메이션 UIView.transition()을 썼다.

가져오면 두 번째 사진처럼 무엇을 써주어야 할지 다 나타나기 때문에 편리하다.

options에서 transitionFilopFromLeft인데 왼쪽에서 오른쪽으로 뒤집히는 애니메이션이 나타나게 된다.

 

    var isBackSide = true
    
    @IBAction func buttonDidClick(_ sender: Any) {
        UIView.transition(with: imageView, duration: 0.6, options: .transitionFlipFromLeft) {
            if self.isBackSide {
                self.imageView.image = UIImage(named: "ace")
            } else {
                self.imageView.image = UIImage(named: "poker")
            }
            
        } completion: { (finished) in
            self.isBackSide = !self.isBackSide
        }
    }

 

switch를 통해, 카드를 뒤집는 것도 위와 유사하다. switchDidClick() 액션 함수 참고하면 된다.

 

Swift 심화 문법 - 옵셔널, 구조체, 클래스

// 구조체
struct Work {
    var task: String
    var hoursToDo: Int
    
    func alert(){
        print("\(self.task)가 앞으로 \(self.hoursToDo) 시간 더 해야 합니다.")
    }
}

var firstWork = Work(task: "코딩하기", hoursToDo: 3)
var secondWork = Work(task: "운동하기", hoursToDo: 2)

firstWork.alert()

// 클래스
class Student {
    var name: String
    var home: String
    
    init(name: String, house: String){
        self.name = name
        self.home = house
    }
    
    func introduce(){
        print("\(home) 기숙사에 사는 \(name)입니다.")
    }
}

var lee = Student(name: "gildong", house: "seoul")
lee.introduce()

 

optional?로 나타난다.

의미는 이 변수에는 값이 들어갈 수 도 있고, 아닐 수도 있다(nil)라는 뜻이다. (우리가 흔히 아는 null 개념이다.)

swift에서는 어떤 변수가 비어있을 수 도 있다면 명시적으로 변수가 'optional'이라고 선언해 주어야 한다.

 

변수 뒤에? 대신! 가 붙은 경우도 종종 있다.

! 는 optional과 non-optional 사이라고 한다. 변수를 선언한 직후 대부분은 값을 바로 넣기 때문에! 는 변수가 nil일 확률이 매우 작은 경우에 사용한다고 한다.

 

var someValue : String? = "안녕하세요"
someValue = nill
someValue = "안녕"

var anotherValue: String = "또 안녕하세요"
anotherValue = "또 안녕"
anotherValue = nil // error가 난다.

 

타이머 앱

segment control을 사용해서 3분, 4분, 5분을 선택하면 배경 색깔이 바뀌고 해당 시간의 타이머가 실행된다. 멈추면 00:00으로 리셋된다. 시간이 60초 미만으로 남았을 시, 글씨 색이 빨간색으로 변한다. transition에서 transitionFlipFromBottom 사용해서 애니메이션을 추가했다.

//
//  ViewController.swift
//  RamenApp
//
//  Created by LeeEunAh on 2022/01/21.
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var timerLabel: UILabel!
    @IBOutlet weak var timerButton: UIButton!
    @IBOutlet weak var segmentControl: UISegmentedControl!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        timerButton.layer.cornerRadius = 10
        // Do any additional setup after loading the view.
    }
    
    var secondsLeft : Int = 180
    var timer : Timer?

    @IBAction func timerButtonClicked(_ sender: Any) {
        
        if timer != nil {
            self.resetTimer()
            self.timerButton.setTitle("타이머 시작하기", for: .normal)
            return
        }
        
        self.timerButton.setTitle("타이머 종료하기", for: .normal)
        
        self.timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: ({ (t) in
            self.secondsLeft -= 1
            self.updateSecondsLabel()
            
            if self.secondsLeft == 0 {
                self.resetTimer()
            }
        }) )
    }
    
    @IBAction func segmentValueChanged(_ sender: Any) {
        let option: Int = segmentControl.selectedSegmentIndex
        switch(option){
        case 1:
            secondsLeft = 240
            view.backgroundColor = UIColor.systemMint
        case 2:
            secondsLeft = 300
            view.backgroundColor = UIColor.systemYellow
        default:
            secondsLeft = 180
            view.backgroundColor = UIColor.systemGreen
        }
        self.resetTimer()
    }
    
    func updateSecondsLabel() {
        let minutes = self.secondsLeft / 60
        let seconds = self.secondsLeft % 60
        
        if self.secondsLeft < 60 {
          self.timerLabel.textColor = UIColor(red: 0.94, green: 0.07, blue: 0.07, alpha: 1.00)
        } else {
          self.timerLabel.textColor = UIColor.black
        }
        
        UIView.transition(with: self.timerLabel, duration: 0.3, options: .transitionFlipFromBottom) {
            if self.secondsLeft > 0 {
                self.timerLabel.text = String(format: "%02d:%02d", minutes, seconds)
            } else {
                self.timerLabel.text = "시간 끝"
            }
        } completion: { animated in
            
        }

    }
    
    func resetTimer() {
        self.timer?.invalidate()
        self.timer = nil
        self.timerLabel.textColor = UIColor.black
        self.timerLabel.text = "00:00"
        self.timerButton.setTitle("타이머 시작하기", for: .normal)
    }
}

 

참고 자료

https://developer.apple.com/documentation/foundation/timer/2091889-scheduledtimer

https://spartacodingclub.kr/online/ios

 

학습을 하면서, Swift가 새삼 친절한 언어라는 것을 느꼈다. transition과  scheduledTimer에서 속성들의 값들을 다 알아서 불러와 주고 탭만 하면 채울 수 있어 편리했다. 또, 에러나 경고가 있을 시에 바로 표시를 해줘서 무엇이 문제인지 파악하기 편리했다. 뭔가 어느 정도 다른 언어로 개발을 했던 사람들이라면 어렵게 처음을 시작할 수 있는 것 같다. 아직 깊은 부분까지 다루지 않아 이렇게 말하는 것 일수도 있다. ㅎㅎ 3주 차부터 여러 스크린을 다루게 된다고 강사님이 말씀하신 것 같은데 기대가 된다.

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

iOS 앱개발 기초반 3주차 복습  (0) 2022.02.10
iOS 앱개발 기초반 1주차 복습  (0) 2022.01.22