본문 바로가기
iOS

iOS 실무 7주차

by asd135 2025. 4. 16.
728x90

enum

enum 열거형명{
열거형 정의
}
enum Compass {
case North
case South
case East
case West
}
//var x : Compass // Compass형 인스턴스 x
print(Compass.North) // North
var x = Compass.West
print(type(of:x)) // Compass
x = .East // x가 Compass형이므로 자료형 생략가능
print(x) // East

자료형 추론이 가능하기 때문에 .으로 접근 가능

 

 

enum Compass {
case North
case South
case East
case West
}
var direction : Compass
direction = .South
switch direction { //switch의 비교값이 열거형 Compass
case .North: //direction이 .North이면 "북" 출력
print("북")
case .South:
print("남")
case .East:
print("동")
case .West:
print("서") //모든 열거형 case를 포함하면 default 없어도 됨
}

 

열거형에 함수도 가능

enum Week {
    case Mon, Tue, Wed, Thur, Fri, Sat, Sun

    func printWeek() { //메서드도 가능
        switch self {
        case .Mon, .Tue, .Wed, .Thur, .Fri:
            print("주중")
        case .Sat, .Sun:
            print("주말")
        }
    }
}

Week.Sun.printWeek() //주말

 

열거형은 rowValue 지정 가능

0, 1, 2으로 순차적으로 증가하지만, 2가 있기 때문에 1, 2, 3,으로 증가

enum Color: Int { //원시값(rawValue) 지정
case red
case green = 2
case blue
}
print(Color.red) //red
print(Color.blue)
print(Color.red.rawValue) //0
print(Color.blue.rawValue)

 

String형 값을 갖는 열거형의 rawValue

enum Week: String {
case Monday = "월"
case Tuesday = "화"
case Wednesday = "수"
case Thursday = "목"
case Friday = "금"
case Saturday //값이 지정되지 않으면 case 이름이 할당됨
case Sunday = "일일"
}
print(Week.Monday) //Monday
print(Week.Monday.rawValue) //월
print(Week.Sunday)
print(Week.Sunday.rawValue)

 

 

옵셔널은 연관 값(associated value)을 갖는 enum

enum Date {
case intDate(Int,Int,Int) //(int,Int,Int)형 연관값을 갖는 intDate
case stringDate(String) //String형 연관값을 값는 stringDate
}
var todayDate = Date.intDate(2025,4,30)
todayDate = Date.stringDate("2025년 5월 20일") //주석처리하면?
switch todayDate {
case .intDate(let year, let month, let day):
print("\(year)년 \(month)월 \(day)일")
case .stringDate(let date):
print(date)
}

 

구조체 

Memberwise Initializer가 자동으로 만들어짐

Int, Double, String 등 기본 자료형은 구조체 (https://developer.apple.com/documentation/swift/int)

 

Int | Apple Developer Documentation

A signed integer value type.

developer.apple.com

 

구조체/enum, 클래스의 차이점:

구조체/enum의 인스턴스는 값(value) 타입, 클래스의 인스턴스는 참조(reference) 타입 

구조체는 상속 불가

 

Memberwise Initializer: 모든 멤버를 초기화 해주는 생성자를 자동으로 만들어줌 (중요)

struct Resolution { //구조체 정의
var width : Int //프로퍼티 초기값이 없어요!!
var height : Int
// init(width: Int, height: Int) {
//     self.width = width
//     self.height = height
// }
} //init()메서드 없어요, 그런데!
let myComputer = Resolution(width:1920,height:1080) //Memberwise Initializer
print(myComputer.width)

 

클래스 내에 구조체

struct Resolution {
var width = 1024
var height = 768
}
class VideoMode {
var resolution = Resolution()
var frameRate = 0.0
}
let myVideo = VideoMode()
print(myVideo.resolution.width) // 중첩된 클래스와 구조체

 

 

차이점을 아는 것이 중요

class는 상속이 가능, 구조체는 value type, class는 reference type

 

 

value 타입

struct Human {
var age : Int = 1
}
var kim = Human()
var lee = kim //값 타입 
print(kim.age, lee.age)
lee.age = 20
print(kim.age, lee.age)
kim.age = 30
print(kim.age, lee.age)

실제 데이터의 복사본이 생성되는 데이터 타입

 

reference 타입

class Human {
var age : Int = 1
}
var kim = Human()
var lee = kim //참조 타입
print(kim.age, lee.age)
lee.age = 20
print(kim.age, lee.age)
kim.age = 30
print(kim.age, lee.age)
//참조 타입은 복사할 때 주소를 복사해서
//한 데이터의 reference가 2개 생김

두 개의 변수가 같은 주소(객체)를 가르킴

 

 

extension

클래스, 구조체, 열거형, protocol에 새로운 기능을 추가

extension Double {
    var squared : Double {
        return self * self
    }
}
let myValue: Double = 3.0
print(myValue.squared) //과제
print(3.5.squared) //Double형 값에도 .으로 바로 사용 가능
print(myValue.isZero) //instance property, false

애플에서 제공하는 원본 Double파일을 수정하지 않고 extension 키워드로 Double에 새로운 기능을 추가함

'iOS' 카테고리의 다른 글

iOS 실무10주차  (0) 2025.05.07
iOS 실무 9주차  (0) 2025.05.05
iOS 실무 6주차  (0) 2025.04.09
iOS 실무 5주차  (0) 2025.04.02
iOS 실무 4주차  (0) 2025.03.26