iOS

Swift 문법 - 1

mJay8194 2024. 3. 13. 16:48

1. 변수 및 상수

1.1. 선언

- 변수는 var, 상수는 let 키워드를 사용

- 기본적으로 변수명 또는 상수명 뒤 자료형을 명시

- 타입 추론(inference): 기본값 존재 시 자료형 명시 생략 가능

var x : Int
let y = 3 //inference

- type(of:변수명): 변수명의 자료형

1.2. 자료형

- Int: 정수를 저장하는 자료형으로, Swift에서는 기본 64비트

- Double: 64비트의 부동소수점 수를 저장하는 자료형으로, 부동소수점 수를 변수 저장 시 기본 자료형

- Float: 32비트의 부동소수점 수를 저장하는 자료형

- Bool: true 또는 false를 저장하는 자료형

- Character: 문자 또는 유니코드 문자 하나를 저장하는 자료형

- String: 문자열을 저장하는 문자열

1.3. Tuple

- 여러 개의 값을 하나의 변수에 저장

- 다른 자료형의 값을 하나에 저장 가능

- index를 통해 값 접근 가능

1.4. property

- property: 클래스 내에 선언된 변수

- class property: 정적 프로퍼티라고도 하며, 인스턴스의 생성과 관계없이 고유한 값을 가진다.

- instance property: instance 생성 시마다 각자의 값을 가진다.

 

2. 연산자

2.1. 연산자의 우선순위

1 ! ~ 논리 NOT, 비트 NOT
2 * / % 곱셈, 나눗셈, 나머지
3 + - 덧셈, 뺄셈
4 << >> 비트 왼쪽 이동, 비트 오른쪽 이동
5 < <= > >= 비교 연산자
6 == != 동등 및 부등 연산자
7 && 논리 AND
8 || 논리 OR
9 = += -=  할당 및 복합 할당 연산자

 

3. Xcode 기본 기능

3.1. 앱 기본 설정

- 최소 실행 운영체제 버전 선택

- 화면 회전 시 디자인 설정 여부

 

3.2. Life Cycle

- 앱이 시작되고 종료될 때까지의 프로세스

- UISceneDelegate는 iOS 13 이후에 도입된 개념으로, 앱의 생명 주기 및 UI 관리와 관련된 이벤트를 처리하는 데 사용

- 이는 여러 개의 앱 인스턴스를 동시에 지원하는 멀티 윈도우 환경을 가능하게 한다.

- 기존에는 UIApplicationDelegate에서 앱의 생명 주기와 UI 세션을 모두 관리했지만, iOS 13부터는 이 두 가지 책임이 분리

- 이제 UIApplicationDelegate는 앱 수준의 이벤트를 처리하고, UISceneDelegate는 특정 UIScene 인스턴스에 대한 생명 주기와 UI를 관리한다.

- UIScene 인스턴스는 앱의 한 화면을 나타내며, 각기 다른 생명 주기를 가질 수 있음

 

3.3. 기본 클래스

- AppDelegate.swift: iOS 애플리케이션의 생명주기를 관리. 즉, 애플리케이션이 시작되고 종료될 때, 백그라운드 상태로 들어가거나 다시 활성화될 때 발생하는 이벤트들을 처리

 

 

- 오류 발생 시 빌드 전에도 미리 알려주는 기능 탑재

변수 초기화를 실시하지 않고 사용 시 알림

 

4. 무드등 앱

- 소스

import UIKit
import AVFoundation

// UIViewController를 상속받는 ViewController 클래스 정의
class ViewController: UIViewController {
    
    // 타이머와 오디오 플레이어 변수 선언
    var colorChangeTimer: Timer?
    var audioPlayer: AVAudioPlayer!
    
    // 스토리보드에서 연결한 음악 재생 스위치 아웃렛
    @IBOutlet weak var musicSwitch: UISwitch!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 탭 제스처 인식기를 생성하고 뷰에 추가
        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTapGesture))
        view.addGestureRecognizer(tapGesture)
        
        // 애플리케이션이 포어그라운드로 진입할 때 호출될 메서드 설정
        NotificationCenter.default.addObserver(self, selector: #selector(applicationWillEnterForeground), name: UIApplication.willEnterForegroundNotification, object: nil)
    }
    
    // 애플리케이션이 포어그라운드로 진입할 때 타이머와 음악 시작
    @objc func applicationWillEnterForeground() {
        startTimerAndMusic()
    }
    
    // 화면을 탭했을 때 타이머와 음악 중지 및 리소스 해제
    @objc func handleTapGesture() {
        stopTimerAndMusic()
        colorChangeTimer = nil
        audioPlayer = nil
        
        // 알림 창 표시
        let alert = UIAlertController(title: "알림", message: "앱을 종료해주세요.", preferredStyle: .alert)
        let okAction = UIAlertAction(title: "확인", style: .default, handler: nil)
        alert.addAction(okAction)
        present(alert, animated: true, completion: nil)
    }
    
    // 스위치 상태 변경 시 호출되는 메서드
    @IBAction func switchDidChange(_ sender: UISwitch) {
        if sender.isOn {
            // 스위치가 켜졌을 때 타이머와 음악 시작
            startTimerAndMusic()
        } else {
            // 스위치가 꺼졌을 때 타이머와 음악 중지
            stopTimerAndMusic()
        }
    }
    
    // 타이머 시작과 음악 재생을 처리하는 메서드
    func startTimerAndMusic() {
        // 배경 음악 재생 설정
        if let soundURL = Bundle.main.url(forResource: "bgm", withExtension: "mp3") {
            do {
                audioPlayer = try AVAudioPlayer(contentsOf: soundURL)
                audioPlayer.play()
            } catch {
                print("음악 파일 로드 또는 재생 중 에러 발생: \(error)")
            }
        }
        
        // 1초마다 반복되는 타이머 생성하여 뷰의 배경색 변경
        colorChangeTimer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { timer in
            let red = CGFloat(arc4random_uniform(256)) / 255.0
            let green = CGFloat(arc4random_uniform(256)) / 255.0
            let blue = CGFloat(arc4random_uniform(256)) / 255.0
            self.view.backgroundColor = UIColor(red: red, green: green, blue: blue, alpha: 1.0)
        }
    }
    
    // 타이머와 음악 재생을 중지하는 메서드
    func stopTimerAndMusic() {
        colorChangeTimer?.invalidate() // 타이머를 중지하고 nil로 설정
        colorChangeTimer = nil
        audioPlayer.stop() // 오디오 플레이어를 중지
    }
}

-실행 화면