Swift 문법 - 1
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() // 오디오 플레이어를 중지
}
}
-실행 화면