Extensions - 2

seocho·2022년 9월 2일
0

iOS

목록 보기
10/24

서브 스크립트

클래스, 구조체, 열거형에서 시퀀스의 멤버 요소에 접근하기 위한 바로가기 첨자로, 단일 타입에 여러 서브스크립트를 정의할 수 있다


let nums: [Int] = [1, 2, 3, 4]
 
nums[0]                // 1
nums[1]    

=> 여기서 []이 서브 스크립트

위를 참고했을 때 Int형을 index로 받고, 해당 index에 해당하는 element를 반환하는 것을 알 수 있다.

기본 사용


let sodeul = "Hello, Sodeul!"
sodeul[0]               // error!!
extension String {
    subscript(idx: Int) -> String? {
        guard (0..<count).contains(idx) else {
            return nil
        }
        let target = index(startIndex, offsetBy: idx)
        return String(self[target])
    }
}
 

=>

let sodeul = "Hello, Sodeul!"
sodeul[0]           // Optional("H")
sodeul[100]         // nil

기본으로 Argument Label을 _로 처리하지 않아도 Argument Label을 사용할 수 있다
ex) [key : 1] -> [1]

서브 스크립트 사용

struct Stack {
    var stack: [Int] = [0, 1, 2, 3, 4, 5]
 
    subscript(index: Int) -> Int {
        get {
            return stack[index]
        }
        set {
            stack[index] = newValue
        }
    }
}

=>


var stack: Stack = .init()
 
stack[0]            // 서브스크립트 getter 접근
stack[1] = 2        // 서브스크립트 setter 접근

타입 서브 스크립트


struct Stack {
    static var stack: [Int] = [0, 1, 2, 3]
 
    static subscript(index: Int) -> Int {
        return stack[index]
    }
}

오버라이딩 여부에 따라 static or class로 선언


Stack[0]        // 0
Stack[1]        // 1

Extensions에 서브 스크립트 추가

위에서 이미 보여줬지만 다시 가져오면


extension String {
    subscript(idx: Int) -> String? {
        guard (0..<count).contains(idx) else {
            return nil
        }
        let target = index(startIndex, offsetBy: idx)
        return String(self[target])
    }
}

이렇게 접근 가능

let sodeul = "Hello, Sodeul!"
sodeul[0]           // Optional("H")
sodeul[100]         // nil

중접된 타입

extension Int {
    enum Kind {
        case negative, zero, positive
    }
    var kind: Kind {
        switch self {
        case 0:
            return .zero
        case let x where x > 0:
            return .positive
        default:
            return .negative
        }
    }
}

=> Int에 새로운 중첩된 열거형 추가, 이 중첩된 열거형은 모든 Int값에서 사용될 수 있음

func printIntegerKinds(_ numbers: [Int]) {
    for number in numbers {
        switch number.kind {
        case .negative:
            print("- ", terminator: "")
        case .zero:
            print("0 ", terminator: "")
        case .positive:
            print("+ ", terminator: "")
        }
    }
    print("")
}
printIntegerKinds([3, 19, -27, 0, -6, 0, 7])
// Prints "+ + - 0 - 0 + "
profile
iOS 개린이

0개의 댓글