[Ios] 무드등 만들기
에러 시 수정
따음표 안에 변수 출력 시 \(변수)사용
연산자
대입 연산자 | = |
산술 연산자 | +, -, *, /, % |
비교 연산자 | ==, !=, >, <, >=, <= |
논리 연산자 | && (AND), ` |
범위 연산자 | ..., ..< |
옵셔널 체이닝 연산자 | ?. |
옵셔널 강제 해제 연산자 | ! |
nil 병합 연산자 | ?? |
비트 연산자 | &, ` |
증감 연산자 | ++, -- |
C언어에는 없는 Swift 연산자
1) 범위 연산자 (... 및 ..<)
... 연산자는 시작 값부터 종료 값까지의 범위를 나타내며, 종료 값도 포함.
..< 연산자는 시작 값부터 종료 값 바로 앞까지의 범위를 나타냄. 이러한 연산자는 반복문에서 자주 사용되며, 범위 기반 작업을 수행할 때 유용.
2) 옵셔널 체이닝 연산자 (?.)
옵셔널 값에 안전하게 접근하기 위해 사용.
옵셔널 체이닝 연산자를 사용하면 옵셔널 값이 nil인 경우에도 속성에 안전하게 접근하거나 메서드를 호출 가능. 이를 통해 옵셔널 값이 nil인 경우 발생할 수 있는 오류를 방지.
3) 제 연산자 (!)
옵셔널 값을 강제로 해제하여 실제 값을 가져오는 데 사용.
옵셔널 값 뒤에 !를 붙여 사용하면, 해당 값이 nil이 아니라고 가정하고 값을 가져옴. 그러나 옵셔널 값이 nil인 경우에는 런타임 오류가 발생할 수 있으므로 주의.
4) nil 병합 연산자 (??)
옵셔널 값이 nil인 경우에 대체 값을 제공하는 데 사용.
왼쪽의 옵셔널 값이 nil이 아니면 그 값을 반환하고, nil이면 오른쪽의 대체 값을 반환. 이를 통해 옵셔널 값이 nil인 경우에 대비한 기본 값 또는 대체 동작을 지정할 수 있음.
swift 범위연산자
... | 폐쇄 범위 (Inclusive) | 1...5 |
..< | 반개방 범위 (Exclusive) | 1..<5 |
AppDelegate.swift 파일
iOS 앱의 중요한 부분으로, 앱의 생명 주기 관리를 담당하는 역할
APP Lift Cycle
Foreground
Active : 앱이 전경에 있고 이벤트를 받고 있음. 일반적으로 사용자와 상호작용하는 동안 앱은 이 상태에 있음
Inactive : 앱이 전경에 있지만 이벤트를 받고 있지 않음
Background
Running : 앱이 백그라운드에 있지만 여전히 코드를 실행. 사용자가 다른 앱으로 전환하거나 홈 화면으로 돌아갔을 때 앱은 일시적으로 이 상태에 머물게 됨
Suspend : 앱이 백그라운드에 있지만 코드를 실행하지 않음. 시스템은 앱을 이 상태로 자동으로 전환하며 필요에 따라 메모리를 회수하. 기 위해 앱을 종료시킬 수 있음.
View Lift Cycle
ViewDidLoad. : 뷰 컨트롤러 클래스가 생성될 때, 가장 먼저 실행. 딱 한 번 실행되기 때문에 초기화 할 때 사용
ViewWillAppear : 뷰가 생성되기 직전에 항상 실행이 되기 때문에 뷰가 나타나기 전에 실행해야 하는 작업들을 여기서 함
ViewDidAppear : 뷰가 생성되고 난 뒤에 실행. 데이터를 받아서 화면에 뿌려주거나 애니메이션 등의 작업을 하는 로직을 작성.
ViewWillAppear에서 로직을 넣었다가 뷰에 반영이 안되는 경우가 있기 때문
ViewWillDisappear : 뷰가 사라지기 직전에 실행
ViewDidDisappear : 뷰가 사라지고 난 뒤에 실행.
순환적으로 발생하기 때문에 화면 전환에 따라 발생해야 하는 로직을 적절한 곳에서 실행시켜야 함
난수 생성하는 방법
1) int,random(in:)
2) arc4random_uniform
3) arc4random()
4) random()
랜덤한 색으로 무드등
배경색 1초마다 계속 변경
무드등 (배경음악 끄고 배경색 고정)
import UIKit
import AVFoundation
// 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()
colorChangeTimer = nil
audioPlayer.stop()
}
}