Swift에서 자료형을 예를들어 표로 만들어줘
스위프트(Swift)에서 사용하는 주요 자료형을 예로 들어 표 형식으로 정리해보겠습니다. Swift는 다양한 기본 데이터 타입을 제공하는데, 아래는 그 중 일부입니다.
자료형 | 설명 | 예시 |
---|---|---|
Int | 정수 타입 | var age: Int = 30 |
UInt | 부호 없는 정수 타입 | var size: UInt = 100 |
Float | 32비트 부동 소수점 타입 | var height: Float = 175.5 |
Double | 64비트 부동 소수점 타입 | var distance: Double = 382.2 |
Bool | 불리언 타입 (참/거짓) | var isHidden: Bool = false |
String | 문자열 타입 | var name: String = “뤼튼” |
Character | 문자 타입 | var letter: Character = ‘A’ |
Optional | 값이 있을 수도, 없을 수도 있는 타입 | var optionalInt: Int? = nil |
Swift는 타입 안전(type-safe) 언어로서, 변수에 할당된 데이터 타입을 명확히 해주어야 하는 특징이 있습니다. 따라서, 위 표에서 볼 수 있는 기본 자료형을 활용할 때는 해당 타입에 맞는 값을 할당해주는 것이 중요합니다. 또한, Optional
은 Swift의 중요한 특징 중 하나로, 값이 ‘없음’을 안전하게 처리할 수 있게 해줍니다.
Swift에서 let과 var를 비교해서 표로 만들어줘
스위프트(Swift)에서 let
과 var
는 각각 상수와 변수를 선언할 때 사용됩니다. 아래 표는 let
과 var
사이의 주요 차이점을 요약하여 보여줍니다.
구분 | let |
var |
---|---|---|
설명 | 상수 선언에 사용. 한 번 값이 할당되면 변경할 수 없음. | 변수 선언에 사용. 할당된 값이 프로그램 실행 도중에 변경될 수 있음. |
사용 예 | let birthYear: Int = 1990 |
var age: Int = 30 |
변경 가능성 | 값 변경 불가. 초기에 할당된 이후, 값의 수정이 허용되지 않음. | 값 변경 가능. 선언 이후 필요에 따라 값을 수정할 수 있음. |
사용 시점 | 값이 변경되지 않고, 한 번 설정되면 변하지 않을 때 사용. 예: 환경설정, 설정값 등 | 값이 실행 중에 변경될 가능성이 있을 때 사용. 예: 카운터, 상태값 등 |
Swift에서는 타입 안전성을 중시하기 때문에, 가능한 한 let
을 사용하여 상수로 선언하는 것이 좋습니다. 이는 코드의 의도를 명확히 하고, 실수로 인한 값 변경을 방지할 수 있기 때문입니다. var
는 값이 변할 가능성이 있는 경우에 한정하여 사용하는 것이 바람직합니다.
Error!
다음과 같이 X 표시가 있는 경우 Xcode에서 수정해줄 수 없다는 의미이다.
다음과 같이 점 표시가 있으면 클릭해서 오류를 수정할 수 있다. 에러 내용은 = 양 옆에 1칸 이상 공백이 있어야 한다는 의미이다.
type(of:)
Swift의 type(of:)
함수는 매개변수로 전달된 인스턴스의 타입을 반환하는 함수입니다. 이 함수는 실행 시간(runtime)에 인스턴스의 실제 타입을 확인할 때 유용하게 사용됩니다. type(of:)
함수의 반환값은 해당 인스턴스의 타입(Type)이며, 이는 컴파일 타임이 아닌 런타임에 결정됩니다.
예시 설명
아래는 type(of:)
함수 사용 예시입니다.
let intValue = 10
let stringValue = "Hello, Swift"
let doubleValue = 10.5
print(type(of: intValue)) // 출력: Int
print(type(of: stringValue)) // 출력: String
print(type(of: doubleValue)) // 출력: Double
위의 예시에서 intValue
, stringValue
, doubleValue
세 변수의 타입을 type(of:)
함수를 통해 확인할 수 있습니다. 각각 Int
, String
, Double
타입이 출력됩니다.
더 복잡한 예시
type(of:)
함수는 더 복잡한 상황에서도 유용하게 사용될 수 있습니다. 예를 들어, 다형성을 활용하는 경우에 객체의 실제 타입을 확인할 때 사용할 수 있습니다.
class Animal {}
class Dog: Animal {}
let myDog: Animal = Dog()
print(type(of: myDog)) // 출력: Dog
위 예시에서 myDog
는 Animal
타입으로 선언되었지만, 실제로는 Dog
클래스의 인스턴스입니다. type(of:)
함수를 사용하면 myDog
변수의 실제 타입이 Dog
임을 확인할 수 있습니다.
사용 시 주의사항
type(of:)
함수는 런타임에 타입을 확인하는 동적 타입 확인 방법입니다. 컴파일 타임에 타입을 확인하려면 다른 방법을 사용해야 합니다.- 이 함수는 타입 정보를 활용하는 동적인 기능 구현에 유용하지만, 과도한 사용은 코드의 복잡성을 증가시킬 수 있으므로 주의해야 합니다.
type(of:)
함수는 Swift의 타입 시스템과 동적 타입 확인 기능을 이해하고 활용하는 데 중요한 도구입니다. 다양한 상황에서 타입 정보를 얻기 위해 적절히 사용될 수 있습니다.
Void는 Swift에서 자료형이 아닐까?
네, 맞습니다. Swift에서 Void
는 실제로 자료형이라기보다는 특정 상황(특히 함수가 아무것도 반환하지 않을 때)을 나타내기 위해 사용되는 키워드입니다. 하지만, Void
는 사실 ()
라는 빈 튜플의 별칭입니다. 이는 함수가 아무 값도 반환하지 않음을 명시적으로 표현하는 방법입니다.
Void의 사용 예시
함수가 아무것도 반환하지 않는 경우, Swift에서는 반환 타입으로 Void
를 사용하거나, 반환 타입을 명시하지 않을 수 있습니다. 반환 타입을 명시하지 않는 것은 -> Void
를 사용하는 것과 같습니다. 또한, -> ()
를 사용하는 것도 같은 의미입니다.
// Void를 사용하여 반환값이 없음을 명시
func noReturnFunction1() -> Void {
print("아무것도 반환하지 않습니다.")
}
// 반환 타입을 생략하여 반환값이 없음을 나타냄
func noReturnFunction2() {
print("아무것도 반환하지 않습니다.")
}
// 빈 튜플을 사용하여 반환값이 없음을 명시
func noReturnFunction3() -> () {
print("아무것도 반환하지 않습니다.")
}
위 세 함수는 모두 아무것도 반환하지 않습니다. Void
가 실제로는 빈 튜플 ()
의 별칭이라는 점을 보여주며, 이는 Swift의 타입 시스템에서 함수가 값을 반환하지 않는다는 것을 나타내는 방법입니다.
결론
따라서, Void
는 Swift에서 특별한 경우를 나타내기 위한 키워드이지, 기본적인 자료형이나 클래스/구조체와 같은 것은 아닙니다. 그러나 Void
의 사용은 함수가 아무런 값을 반환하지 않음을 명확하게 표현하는 데 있어 중요한 역할을 합니다.
문자열 중간에 변수나 상수를 넣는 방법
var x = 10 // 초기 값이 있을 땐 자료형을 선언하지 않아도 된다.
// x = 10
print("x의 값은 \(x) 입니다.")
변수나 상수의 값을 문자열 중간에 넣을땐 \()
사이에 넣어주면 된다.
type annotation , type inference
var x = 10 // 초기 값이 있을 땐 컴파일러가 type inference를 해준다
Swift의 연산자
Swift에서 연산자는 다양한 종류가 있으며, 용도에 따라 사용 빈도가 달라집니다. 여기서는 Swift 연산자를 일반적으로 많이 사용하는 순서로 배열하고, 각 연산자의 예시를 표로 정리해보겠습니다. 이 순서는 프로그래밍 스타일이나 개발 중인 프로젝트의 특성에 따라 다를 수 있습니다만, 기본적으로 자주 사용되는 연산자들을 중심으로 설명하겠습니다.
연산자 유형 | 연산자 | 설명 | 예시 |
---|---|---|---|
할당 연산자 | = |
왼쪽 변수에 오른쪽 값을 할당 | var a = 10 |
산술 연산자 | + , - , * , / |
더하기, 빼기, 곱하기, 나누기 | let sum = 5 + 3 |
복합 할당 연산자 | += , -= , *= , /= |
값 연산 후 할당 | var b = 5; b += 2 |
비교 연산자 | == , != , > , < , >= , <= |
값 비교 | if a == b { ... } |
논리 연산자 | && , || , ! |
AND, OR, NOT 연산 | if a > 10 && b < 5 { ... } |
범위 연산자 | ..< , ... |
범위 지정 | for i in 1..<5 { ... } |
닐 병합 연산자 | ?? |
옵셔널 값이 nil 일 경우 대체값 제공 |
let c = a ?? 0 |
조건부 연산자 | ? : |
조건에 따라 값 반환 | let max = a > b ? a : b |
옵셔널 체이닝 | ?. |
옵셔널 값에 접근 | let count = items?.count |
옵셔널 강제 추출 | ! |
옵셔널 값의 강제 추출 | let count = items!.count |
이 표에 나열된 연산자들은 Swift 프로그래밍에서 자주 사용되며, 각기 다른 상황과 목적에 맞게 선택하여 사용됩니다. 연산자의 선택과 사용은 프로그램의 로직과 효율성, 가독성에 큰 영향을 미치므로, 각 연산자의 의미와 사용법을 정확히 이해하는 것이 중요합니다.
C에는 없는 Swift 연산자
Swift는 C언어를 기반으로 하면서도, 보다 안전하고 표현력이 뛰어난 프로그래밍을 가능하게 하는 다양한 추가 기능과 연산자를 제공합니다. C언어에는 없는 Swift 특유의 연산자 중에서도 특히 많이 사용되는 몇 가지를 예시와 함께 설명하겠습니다.
1. 옵셔널 연산자
-
옵셔널 체이닝 (
?.
): 옵셔널이nil
인지 체크하면서 프로퍼티, 메서드, 서브스크립션에 접근할 수 있게 해줍니다.nil
이면 연산은 즉시 중단되고nil
을 반환합니다.let john = Person(name: "John") let johnsStreet = john.address?.street
위 예시에서
address
가nil
이면johnsStreet
도nil
값을 가지게 됩니다. -
옵셔널 강제 추출 (
!
): 옵셔널에서 값을 강제로 추출합니다. 만약 옵셔널이nil
이라면 런타임 에러가 발생합니다.let possibleNumber = "123" let forcedNumber = Int(possibleNumber)!
possibleNumber
문자열을Int
로 변환하려고 할 때, 옵셔널 강제 추출을 사용합니다.
2. 범위 연산자
-
닫힌 범위 연산자 (
...
): 시작값과 종료값을 포함하는 범위를 정의합니다.for idx in 1...5 { print(idx) }
위 코드는 1부터 5까지의 숫자를 출력합니다.
-
반닫힌 범위 연산자 (
..<
): 시작값은 포함하지만 종료값을 포함하지 않는 범위를 정의합니다.for idx in 1..<5 { print(idx) }
위 코드는 1부터 4까지의 숫자를 출력합니다.
3. 닐 병합 연산자 (??
)
-
옵셔널 값이
nil
일 경우, 기본값을 제공합니다. 이 연산자는 옵셔널이nil
인지 체크하고,nil
이면 우측의 값을 반환합니다.let defaultColor = "red" var userDefinedColor: String? // 기본값은 nil var currentColor = userDefinedColor ?? defaultColor
userDefinedColor
가nil
이므로currentColor
는"red"
가 됩니다.
이러한 연산자들은 Swift의 안전성과 간결성을 높이는 데 크게 기여하며, C언어에는 없는 유용한 기능들입니다. 옵셔널과 관련된 연산자들은 Swift의 가장 큰 특징 중 하나로, 값의 부재를 안전하게 처리할 수 있게 해줍니다.
무드등 만들기
- Minimum Deployments
- 실행할 수 있는 최소 버전을 지정하는 부분
- 보통 가장 최신 버전으로 하지 않는다 (업데이트가 중단된 기종을 사용하는 경우도 있기 때문)
- iPhone Orientation
- Portrait : 세로 화면
- Landscape left/right : 가로 화면
GPT 도움 받기
1. 기획 단계
- 목적 정의: 사용자에게 어떤 가치를 제공할지 명확히 합니다.
- 기능 명세: 무드등 색상 변경, 밝기 조절, 타이머 설정 등 앱의 기능을 구체적으로 정합니다.
- 디자인: 사용자 인터페이스(UI) 디자인을 구상합니다. 사용자 경험(UX)을 고려하여 직관적이고 사용하기 쉬운 디자인이 중요합니다.
2. 개발 준비
- Swift 학습: Swift 언어에 대한 기초 지식을 습득합니다.
- Xcode 설치: macOS 운영 체제에서 Xcode를 설치합니다.
- 개발 문서 읽기: Apple의 공식 개발 문서인 SwiftUI 또는 UIKit를 읽고 이해합니다.
3. 개발 단계
- 프로젝트 생성: Xcode에서 새로운 iOS 앱 프로젝트를 생성합니다.
- UI 구현: SwiftUI 또는 UIKit을 사용하여 앱의 인터페이스를 구현합니다.
- 기능 구현: 사용자가 무드등의 색상과 밝기를 조절할 수 있도록 합니다. 필요하다면 외부 라이브러리를 사용할 수도 있습니다.
- 디바이스 연동 고려: 실제 무드등 하드웨어와 앱이 통신할 수 있도록 Bluetooth 또는 Wi-Fi 연동 기능을 구현합니다. (해당되는 경우)
4. 테스트 및 디버깅
- 시뮬레이터와 실제 디바이스 테스트: 앱이 다양한 디바이스와 iOS 버전에서 정상 작동하는지 테스트합니다.
- 버그 수정: 테스트 과정에서 발견된 버그를 수정합니다.
5. 배포
- 앱 스토어 등록: 앱을 애플 앱 스토어에 등록하고, 심사를 받습니다.
- 마케팅 및 홍보: 타겟 사용자에게 앱을 알리기 위한 마케팅 전략을 수립합니다.
앱 스토어에서 인기 있는 무드등 앱들은 사용자의 경험을 풍부하게 하고 다양한 상황에 맞춰 조명의 분위기를 조절할 수 있도록 설계되어 있습니다. 여기 몇 가지 공통적으로 발견되는 기능들을 소개합니다:
1. 색상 선택 기능
- 사용자가 원하는 색상을 자유롭게 선택할 수 있게 해줍니다. 일부 앱들은 색상 휠을 제공하여 더욱 세밀한 색상 조정이 가능하도록 합니다.
2. 밝기 조절
- 조명의 밝기를 사용자가 직접 조절할 수 있게 해주는 기능입니다. 이를 통해 사용자는 다양한 상황에 맞게 조명의 밝기를 설정할 수 있습니다.
3. 사전 설정된 테마 또는 모드
- “읽기”, “취침”, “로맨틱” 등 특정 분위기나 상황에 적합한 사전 설정된 색상과 밝기 조합을 제공합니다.
4. 타이머 및 알람 기능
- 사용자가 설정한 시간에 자동으로 무드등이 켜지거나 꺼지도록 하는 타이머 기능을 제공합니다. 취침 시간이나 일어나는 시간에 맞춰 사용할 수 있습니다.
5. 음악 동기화
- 무드등이 사용자의 재생 목록이나 특정 음악에 맞춰 색상과 밝기가 변하는 기능을 제공하기도 합니다. 이를 통해 음악에 맞는 분위기를 조성할 수 있습니다.
6. 사용자 정의 설정 저장
- 사용자가 자신만의 색상, 밝기, 모드 설정을 저장하고, 이를 쉽게 불러올 수 있게 해주는 기능입니다.
7. 리모트 컨트롤
- 스마트폰을 이용해 집 안의 다양한 무드등을 원격으로 제어할 수 있는 기능. 이는 특히 스마트 홈 환경에서 유용합니다.
AppDelegate.swift / SceneDelegate.swift ?
AppDelegate.swift
파일은 iOS 애플리케이션의 생명주기를 관리하는 중요한 역할을 하는 스위프트 파일입니다. 이 파일 내에 있는 AppDelegate
클래스는 애플리케이션의 시작점을 정의하고, 애플리케이션의 상태 변화(예: 시작, 종료, 백그라운드 전환 등)에 대해 반응하는 데 사용됩니다.
AppDelegate
는 UIApplicationDelegate
프로토콜을 준수(conform)하며, 이 프로토콜은 애플리케이션 생명주기와 관련된 일련의 메서드를 정의합니다. 주요 역할과 관련된 몇 가지 메서드는 다음과 같습니다:
1. application(_:didFinishLaunchingWithOptions:)
- 애플리케이션이 처음 시작될 때 호출됩니다. 초기 설정이나 애플리케이션 구성 요소의 초기화에 사용됩니다.
2. applicationWillResignActive(_:)
- 애플리케이션이 활성 상태를 잃기 직전에 호출됩니다. 예를 들어, 전화가 오거나 SMS 메시지가 도착했을 때입니다.
3. applicationDidEnterBackground(_:)
- 애플리케이션이 백그라운드 상태로 전환될 때 호출됩니다. 사용자 데이터 저장, 타이머 중지 등 백그라운드로 전환하기 전에 수행해야 할 작업을 여기서 처리합니다.
4. applicationWillEnterForeground(_:)
- 애플리케이션이 백그라운드에서 다시 활성 상태로 전환되기 직전에 호출됩니다.
5. applicationDidBecomeActive(_:)
- 애플리케이션이 활성 상태가 되었을 때 호출됩니다. 애플리케이션을 다시 시작하거나, 사용자에게 UI를 다시 보여줄 준비가 되었을 때 수행할 작업을 여기서 처리합니다.
6. applicationWillTerminate(_:)
- 애플리케이션이 종료되기 직전에 호출됩니다. 필요한 마지막 데이터 저장이나 자원 정리 작업을 여기서 수행합니다.
AppDelegate.swift
파일은 애플리케이션의 전반적인 행동을 관리하고, 애플리케이션의 다양한 상태에 대한 반응을 정의하는 중심적인 역할을 합니다. 따라서 iOS 개발에서 매우 중요한 파일 중 하나로 간주됩니다.
iOS 13 이상에서 도입된 SceneDelegate.swift
파일은 애플리케이션의 UI 생명주기를 관리하는 역할을 담당합니다. AppDelegate
가 애플리케이션 전체의 생명주기를 관리하는 것에 비해, SceneDelegate
는 애플리케이션 내의 개별 UI 세션 또는 “씬(Scene)”의 생명주기를 관리합니다. 이는 멀티태스킹, 다중 창 지원 등 iOS의 확장된 기능들을 더욱 효율적으로 관리하기 위한 목적으로 도입되었습니다.
SceneDelegate.swift
파일에는 UISceneDelegate
프로토콜을 준수하는 SceneDelegate
클래스가 포함되어 있으며, 이 클래스는 다음과 같은 주요 메서드들로 구성됩니다:
1. scene(_:willConnectTo:options:)
- 씬이 생성되고 초기 UI 설정이 필요할 때 호출됩니다. 씬의 초기 뷰 컨트롤러를 구성하는 데 사용됩니다.
2. sceneDidDisconnect(_:)
- 씬과의 연결이 끊길 때 호출됩니다. 필요한 정리 작업을 수행합니다.
3. sceneDidBecomeActive(_:)
- 씬이 활성 상태가 되었을 때 호출됩니다. 씬이 사용자와 상호작용을 시작할 때 필요한 작업을 수행합니다.
4. sceneWillResignActive(_:)
- 씬이 비활성 상태가 되기 직전에 호출됩니다. 잠시 중단된 작업이나 진행 중인 작업을 일시 정지합니다.
5. sceneWillEnterForeground(_:)
- 씬이 백그라운드에서 포그라운드로 전환될 때 호출됩니다. 여기서 애플리케이션을 다시 활성화하는 데 필요한 작업을 수행합니다.
6. sceneDidEnterBackground(_:)
- 씬이 백그라운드 상태로 전환될 때 호출됩니다. 여기서 사용자 데이터의 저장이나 백그라운드 작업을 시작하는 등의 작업을 수행합니다.
SceneDelegate
는 iOS 13 이상에서 애플리케이션의 다중 창 지원과 같은 기능을 더욱 세밀하게 제어할 수 있게 해주며, 각 씬의 생명주기를 독립적으로 관리할 수 있도록 도와줍니다. AppDelegate
와 함께, 이 두 클래스는 현대적인 iOS 애플리케이션의 핵심적인 구성 요소로 작용합니다.
viewDidLoad / viewWillAppear / viewDidAppear
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
print("viewDidLoad")
}
override func viewWillAppear(_ animated: Bool) {
print("viewWillAppear")
}
override func viewDidAppear(_ animated: Bool) {
print("viewDidAppear")
}
}
/**
실행 결과
console 창에
viewDidLoad
viewWillAppear
viewDidAppear
**/
App Life Cycle
View Life Cycle
view
Swift에서는 변수가 클래스 안에 있으면 이름이 property가 된다.
Swift에서 0~255 사이의 난수를 발생시키는 방법
Swift에서 0부터 255 사이의 난수를 발생시키는 방법은 여러 가지가 있습니다. 여기서는 가장 많이 사용되는 방법들을 순서대로 소개하겠습니다.
1. Int.random(in:)
메서드 사용하기
Swift 4.2 이상에서 Int.random(in:)
메서드를 사용하면 특정 범위 내에서 난수를 쉽게 생성할 수 있습니다. 이 방법은 가장 직관적이고 간단하며, Swift 표준 라이브러리에 포함되어 있어 가장 널리 사용됩니다.
let randomNumber = Int.random(in: 0...255)
2. arc4random_uniform()
함수 사용하기
arc4random_uniform()
함수는 UInt32
타입의 난수를 반환합니다. 이 함수는 Swift 4.2 이전 버전에서도 널리 사용되었으며, 여전히 많은 프로젝트에서 사용되고 있습니다. 0부터 주어진 상한값(하지만 상한값은 포함하지 않음) 사이의 난수를 생성합니다. 따라서 256을 인자로 넣으면 0부터 255 사이의 값을 얻을 수 있습니다.
let randomNumber = arc4random_uniform(256)
3. randomElement()
메서드 사용하기
배열이나 컬렉션에 있는 요소 중에서 무작위로 하나를 선택할 때 randomElement()
메서드를 사용할 수 있습니다. 0부터 255까지의 숫자를 배열로 만들고, 그 중에서 임의의 요소를 선택할 수 있습니다. 이 방법은 다소 비효율적일 수 있지만, 특정 조건에서 유용하게 사용될 수 있습니다.
let randomNumber = (0...255).randomElement()
4. GameplayKit
사용하기
GameplayKit
프레임워크에는 난수 생성기가 포함되어 있습니다. GKRandomDistribution
클래스를 사용해 특정 범위 내에서 균일한 분포를 가진 난수를 생성할 수 있습니다. 이 방법은 게임 개발 또는 더 복잡한 난수 생성 요구사항이 있는 경우 유용할 수 있습니다.
import GameplayKit
let randomSource = GKRandomSource.sharedRandom()
let randomNumber = randomSource.nextInt(upperBound: 256)
위 방법들 중에서 상황과 필요에 맞는 것을 선택하여 사용하시면 됩니다. 가장 간단하고 직관적인 방법은 Int.random(in:)
메서드를 사용하는 것입니다.
무드등 앱 소스
import UIKit
import AVFoundation
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
// 생성된 랜덤 색상을 사용하여 ViewController의 배경색을 설정합니다.
self.view.backgroundColor = UIColor(red: red, green: green, blue: blue, alpha: 1.0)
}
}
func stopTimerAndMusic() {
// 타이머와 음악 재생을 중지합니다.
colorChangeTimer?.invalidate()
colorChangeTimer = nil
audioPlayer.stop()
}
}
출처
- Smile Han의 iOS 프로그래밍 실무, 한성현(출판 예정), PPT로 제공
- Do it! 스위프트로 아이폰 앱 만들기 입문(개정 7판)(이지스퍼블리싱,송호정, 이범근, 2023.1)
- 핵심만 골라 배우는 SwiftUI 기반의 iOS 프로그래밍(제이펍, 닐 스미스, 2023.12)
- https://www.techotopia.com/index.php/IOS_iPhone_iPad_eBooks
- 스위프트 프로그래밍(Swift 5) 3판(한빛미디어, 야곰, 2019.10)
- 꼼꼼한 재은 씨의 스위프트 기본편 (루비페이퍼, 이재은, 2018.05)
- 꼼꼼한 재은 씨의 스위프트 실전편 (Swift) (루비페이퍼, 이재은, 2018.08)
- 꼼꼼한 재은 씨의 Swift 문법편 (루비페이퍼, 이재은, 2017.12)