본문 바로가기
Practice & Study/스파르타코딩클럽

iOS 앱개발 기초 2주차 : 조건문/반복문, 옵셔널(nil), 클래스/구조체

1. 조건문과 반복문의 기본 형식

 

- 조건문

if age > 20 {

     print("성인이에요")

} else {

     print("청소년이에요")

}

 

- 반복문

for i in 0..<100 {

     print(i)

}

 

 

2. imageview의 image 바꾸기

imageView.image = UIImage(named: "ace")

전제조건 :

Assets.xcassets 폴더의 ace 라는 이름의 이미지가 미리 업로도 되어 있어야 한다.

Outlet Connection -> @IBOutlet weak var imageView: UIImageView!

 

 

3. 반복문으로 여러 개의 텍스트 필드에 텍스트 넣기

@IBOutlet var textFields: [UITextField]!

for textField in textFields {

     textField.text = "모두 텍스트가 들어갑니다".

}

 

 

4. 카드 뒤집기에 Flip 애니메이션 넣기

@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

     }

}

 

5. 여러 개의 textField를 하나의 textFields Outlet에 연결하기

@IBOutlet var textFields: [UITextField]!

여러 개의 텍스트 필드를 모두 위 textFields에 control을 누르고 끌어다 연결한다. 

 

 

5. 스위치 버튼 사용해보기

@IBOutlet weak var onOffSwitch: UISwitch!

if self.onOffSwitch.isOn { ... }

 

 

6. 옵셔널 (Optional)

 

= 값이 채워져 있을 수도 있고, 비어 있을 수도 있다(nil). (0과 nil은 다르다)

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

 

? 를 이용하여 선언할 수 있다.

var someValue: String? = "어떤 값"

요약하자면, 옵셔널은 해당 변수가 비어있을 가능성을 표현한다.

 

반대로 절대 nil이 될 리 없다는 표시는 !

var obviousFruit: String = someFruit.first!

실은 optional 과 non-optional 사이다.

 

var value: Int = 3

var valueToBeSet: Int! = 4

var valueCanBeNil: Int? = 5

 

value = nil // 에러!

valueToBeSet = nil // 가능

valueCanBeNil = nil // 가능

 

value = valueToBeSet // 가능

value = valueCanBeNil // 불가능

value = valueCanBeNil! // 가능

 

 

7. 클래스와 구조체

차이점 : 

Call by value 는 구조체 (struct), 생성자 초기화를 할 필요 없음.

Call by reference 클래스 (class), 생성자 초기화가 필요함.

 

공통점 : 내부에 변수(property)와 함수(method)를 가질 수 있고, . 연산자를 통해 접근한다.

 

- 구조체 기본 형식

struct Work {

     var task: String

     var hoursToDo: Int

}

- 구조체 이용

var firstWork = Work(task: "강의자료 작성하기", hoursToDo: 3)

var secondWork = Work(task: "분리수거 하기", hoursToDo: 1)

 

- 클래스 기본 형식

 

class Student {

     var name: String

     var house: String

 

     init(name: String, house: String) { // 생성자 초기화

         self.name = name

         self.house = house

     }

}

 

- 클래스 이용

 

var joo = Student(name: "주", house: "슬리데린")

var kim = Student(name: "김", house: "그리핀도르")

 

 

8. 직사각형 버튼의 코너 둥글게 만들기

override func viewDidLoad() {

     super.viewDidLoad()

     timerButton.layer.cornerRadius = 10

}

 

9. 타이머 기능을 이용하여 타이머 만들기

 

var secondsLeft: Int = 10 //원래는 180초지만, 10초로 테스트 합시다
    
@IBAction func timerButtonClicked(_ sender: Any) {
    //1초마다 타이머 반복 실행
    Timer.scheduledTimer(withTimeInterval: 1, repeats: true, block: { (t) in
        //남은 시간(초)에서 1초 빼기
        self.secondsLeft -= 1
        
        //남은 분
        var minutes = self.secondsLeft / 60
        //그러고도 남은 초
        var seconds = self.secondsLeft % 60
        
        //남은 시간(초)가 0보다 크면
        if self.secondsLeft > 0 {
            self.timerLabel.text = "\(minutes):\(seconds)"
        } else {
            self.timerLabel.text = "시간 끝!"
        }
    })
}

 

10. 타이머 양식에 맞게 숫자 표시하기

self.timerLabel.text = String(format: "%02d:%02d", minutes, seconds)

 

11. 타이머 멈추기

self.timer?.invalidate() // 단어 뜻 무효화하다

 

12. 라면타이머 전체 코드 // 세그먼트도 이용했음.

//
//  ViewController.swift
//  ramenTimer
//

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var timerLabel: UILabel!
    @IBOutlet weak var timerButton: UIButton!
    @IBOutlet weak var segment: UISegmentedControl!
    
    var secondsLeft: Int = 180
    var timer: Timer? //?는 타이머가 없을 때도 있기 때문에
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        timerButton.layer.cornerRadius = 10
        
        self.updateTimerLabel()
    }

    func resetTimer() { //타이머를 종료시켜주는 함수
        timer?.invalidate() //단어 뜻 무효화하다
        timer = nil
        timerButton.setTitle("타이머 시작하기", for: .normal)
    }
    
    func updateTimerLabel() {
        var minutes = self.secondsLeft / 60
        var seconds = self.secondsLeft % 60
        
        if self.secondsLeft < 10 {
            self.timerLabel.textColor = UIColor.red
        }
        else {
            self.timerLabel.textColor = UIColor.black
        }
        
        UIView.transition(with: self.timerLabel, duration: 0.3, options: .transitionFlipFromBottom) {
            if self.secondsLeft > 0 {
                //self.timerLabel.text = "\(minutes):\(seconds)"
                self.timerLabel.text = String(format: "%02d:%02d", minutes, seconds)
            } else {
                self.timerLabel.text = "시간 끝!"
            }
        } completion: { (animated) in
            
        }
    }
    
    @IBAction func timerButtonClicked(_ sender: Any) {
        if timer != nil {
            resetTimer()
            return
        }
        
        self.timerButton.setTitle("타이머 종료하기", for: .normal)
        self.updateTimerLabel()
        
        timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { (t) in
            self.secondsLeft -= 1
            self.updateTimerLabel()
            
            if self.secondsLeft == 0 {
                self.resetTimer()
            }
        }
    }
    
    @IBAction func segmentValueChanged(_ sender: Any) {
        print(segment.selectedSegmentIndex)
        if segment.selectedSegmentIndex == 0 {
            self.secondsLeft = 60 * 3
            self.updateTimerLabel()
        } else if segment.selectedSegmentIndex == 1 {
            self.secondsLeft = 60 * 4
            self.updateTimerLabel()
        } else if segment.selectedSegmentIndex == 2 {
            self.secondsLeft = 60 * 5
            self.updateTimerLabel()
        }
    }
}