[swift] 18. Enumeration (열거형)


열거형이란 연관성이 있는 값을 모아 놓은 것을 말한다.




열거형 예제

enum CompassPoint { // 연관된 항목을 나열하기 위한 열거형
    case north
    case south
    case east
    case west

    /*
    위 코드를 다음과 같이 작성할 수 있다.
    case north, south, east, west
    */
}

var direction = CompassPoint.east
print("direction: \(direction)")

direction = .west

switch direction {
    case .north:
        print("north")
    case .south:
        print("south")
    case .east:
        print("east")
    case .west:
        print("west")
}

출력 결과

direction: east
west



원시 값을 가지는 열거형

// 스위프트는 다양한 타입의 원시 값을 가질 수 있다.
enum CompassPoint: String { // CompassPoint의 각 항목이 String 원시 값을 가지게 한다.
    case north = "북"
    case south = "남"
    case east = "동"
    case west = "서"
}

var direction = CompassPoint.west

switch direction {
    // rawValue라는 프로퍼티를 통해 원시 값을 가져올 수 있다.
    case .north:
        print(direction.rawValue) 
    case .south:
        print(direction.rawValue)
    case .east:
        print(direction.rawValue)
    case .west:
        print(direction.rawValue)
}

실행 결과



원시 값을 가지고 열거형을 반환

enum CompassPoint: String { // CompassPoint의 각 항목이 String 원시 값을 가지게 한다.
    case north = "북"
    case south = "남"
    case east = "동"
    case west = "서"
}

let direction2 = CompassPoint(rawValue: "남")
print(direction2)

출력 결과

south



열거형의 연관 값을 반환

enum PhoneError {
    case unknown
    case batteryRow(String)
}

let error = PhoneError.batteryLow("배터리가 곧 방전됩니다.")
print(error)

print("\nswitch")

switch error {
    case .batteryLow(let message):
        print(message)
    case .unknown:
        print("알 수 없는 에러입니다.")
}

출력 결과

배터리가 곧 방전됩니다.

switch
배터리가 곧 방전됩니다.

[swift] 17. Extension (익스텐션)


익스텐션이 타입에 추가할 수 있는 기능

  • 연산 타입 프로퍼티 / 연산 인스턴스 프로퍼티
  • 타입 메서드 / 인스턴스 메서드
  • 이니셜라이저
  • 서브스크립트
  • 중첩 타입
  • 특정 프로토콜을 준수할 수 있도록 기능 추가
extension SomeType {
    // 추가 기능
}




extension 예제


Int extension

extension Int { // Int형 타입의 값이 짝수인지 홀수인지 판별할 수 있는 기능 추가.
    // Int 타입의 어떠한 인스턴스에도 사용이 가능하다.
    var isEven: Bool {
        return self % 2 == 0
    }

    var isOdd: Bool {
        return self % 2 == 1
    }
}

var number = 3
var isOdd = number.isOdd
var isEven = number.isEven

print("number(\(number)) - isOdd: \(isOdd), isEven: \(isEven))

출력 결과

number(3) - isOdd: true, isEven: false



String extension

extension String { // String to Int extension
    func convertToInt() -> Int? {
        return Int(self)
    }
}

var string = "0"
print(string)
print(string.convertToInt())

출력 결과

"0"
0

[swift] 16. Protocol (프로토콜)


프로토콜이란 특정 역할을 하기 위한 메서드, 프로퍼티, 기타 요구사항 등의 청사진을 의미한다.

protocol 이름 {

}




protocol 사용 방법

protocol SomeProtocol {

}

protocol SomeProtocol2 {

}

struct SomeStructure: SomeProtocol, SomeProtocol2 { // 프로토콜 채택

}

struct SomeStructure2: SuperClass, SomeProtocol, SomeProtocol2 { // 상속받을 클래스가 있다면 클래스를 맨 앞에 적는다.

}

protocol FirestProtocl {
    var name: Int { get set } // 읽기, 쓰기가 가능한 property
    var age: Int { get }    // 읽기만 가능한 property
}

protocol AnotherProtocol {
    static var someTypeProperty: Int { get set }    // 프로토콜에서 타입 프로퍼티를 요구하려면 맨 앞에 static을 작성.
}

protocol SomeProtocol3 {
    func someTypeMethod()   // 메소드 요구사항 정의
    // 메서드에 필요한 매개변수를 정의해 주어야 한다.(default 값은 지정할 수 없다.)
}

protocol SomeProtocol4 {
    init(someParameter: Int)
}

protocol SomeProtocol5 {
    init()
}

class SomeClass: SomeProtocol5 {
    required init() {   // 클래스에서는 생성자 요구사항을 만족시키기 위해서는 required가 필요하다. (만약 클래스 자체가 상속받을 수 없는 final 클래스라면 required를 붙일 필요가 없다.)

    }
}




예제

protocol FullyNames {
    var fullName: String { get set }
    func printFullName()
}

struct Person: FullyNames {
    var fullName: String 
    fullName = "이준혁"
    func printFullName() {
        print(fullName)
    }

    // 위 변수와 메서드를 정의하지 않으면 프로퍼티의 요구사항을 충족시키지 않아 에러가 발생한다.
}

출력 결과

이준혁

[swift] 15. assert와 guard


assert

  • 특정 조건을 체크하고, 조건이 성립되지 않으면 메세지를 출력 하게 할 수 있는 함수
  • assert 함수는 디버깅 모드에서만 동작하고 주로 디버깅 중 조건의 검증을 위하여 사용한다.

guard 문

  • 뭔가를 검사하여 그 다음에 오는 코드를 실행할지 말지 결정 하는 것이다.
  • guard 문에 주어진 조건문이 거짓일 때 구문이 실행된다.




예제

assert

var value = 0
assert(value == 0)

value = 2
assert(value == 0, "값이 0이 아닙니다.")

이와 같이 실행하게 되면 다음과 같이 RunTime ERROR가 발생한다.

Assertion failed: 값이 0이 아닙니다.




guard

guard 조건 else {
    // 조건이 false 이면 else 구문이 실행되고, return, throw, break를 통해 이 후 코드를 실행하지 않도록 한다.
}


guard 예제 1

func guardTest(value: Int) {
    guard value == 0 else { return }
    print("안녕하세요")
}

guardTest(value: 2) // value가 0이 아니기 때문에 guard문에 막혀 return되어 아무 것도 출력이 되지 않는다.
guardTest(value: 0) // value가 0이기에 "안녕하세요"가 출력된다.

출력 결과

안녕하세요


guard 예제 2

func guardTest(value: Int?) { // 매개변수를 옵셔널 타입으로 선언
    guard let value = value else { return } // 값이 nil이라면 return
    print("value: \(value)")
}

guardTest(value: 2)
guardTest(value: nil)

출력 결과

2

[swift] 14. Type casting (타입 캐스팅)


타입캐스팅이란 인스턴스의 타입을 확인하거나 어떠한 클래스의 인스턴스를 해당 클래스 계층 구조의 슈퍼 클래스나 서브 클래스로 취급 하는 방법을 말한다.

swift에서는 타입 캐스팅을 is, as로 구현할 수 있다.




예제

class MediaItem {
    var name: String
    init(name: String) {
        self.name = name
    }
}

class Movie: MediaItem {
    var director: String
    init(name: String, director: String) {
        self.director = director
        super.init(name: name)
    }
}

class Song: MediaItem {
    var artist: String
    init(name: String, artist: String) {
        self.artist = artist
        super.init(name: name)
    }
}

let library = [ // library는 타입 추론에 의해 MediaItem 타입의 배열이다.
    Movie(name: "기생충", director: "봉준호")
    Song(name: "Lemon Tree", artist: "Post Malone")
    Movie(name: "올드보이", director: "박찬욱")
    Song(name: "Ballin", artist: "Parisalexa")
    Song(name: "Peter Pan Was Right", artist: "Anson Seabra")
]

var movieCount = 0
var songCount = 0

for item in library {
    if item is Movie {
        movieCount += 1
    } else if item is Song {
        songCount += 1
    }
}

print("Media library contains \(movieCount) movies and \(songCount) songs")

for item in library {   // library 배열의 모든 항목
    if let movie = item as? Movie { // as?는 옵셔널 값을 반환한다.
        print("Movie: \(movie.name), dir. \(movie.director)")
    } else if let song = item as? Song {
        print("Song: \(song.name), by \(song.artist)")
    }
}

출력 결과

Media library contains 2 movies and 3 songs
Movie: 기생충, dir. 봉준호
Song: Lemon Tree, by Post Malone
Movie: 올드보이, dir. 박찬욱
Song: Ballin, by Parisalexa
Song: Peter Pan Was Right, by Anson Seabra