Swift/개념 & 응용

[Swift] Swift Interview Questions - Intermediate(중급)

유정주 2022. 8. 21. 18:11
반응형

현재 포스팅은 2편 Intermediate 질문입니다.

1편 Beginner 보러가기

 

Question 1

차이가 없습니다.

nil과 Optional.none은 같습니다.

동작은 같아도 nil로 작성하는 것이 일반적인 코드 컨벤션에 더 맞습니다.

 

Question 2

let 인스턴스는 mutating 메서드를 호출할 수 없습니다.

mutating 메서드는 값을 바꿀 것이라는 전제 하에 정의한 메서드인데

let 구조체 인스턴스는 내부 프로퍼티를 변경할 수 없으므로 컴파일 에러가 발생합니다.

 

Question 3

I love cars가 출력됩니다.

thing 변수를 변경하기 전에 closure에서 thing을 캡처했습니다.

따라서 I love cars가 출력됩니다.

만약 [thing]이 없었다면 "I love airplanes"가 출력되었을 것입니다.

(저는 처음에 [thing] 캡처를 간과하여 틀렸네요 ㅠ)

 

Question 4

extension Array where Elements: Comparable {
    func countUniques() -> Int {
    	let sortedArray = self.sorted()
        let inital: (Element?, Int) = (.none, 0)
        let reduced = sortedArray.reduce(initial) {
        	($1, $0.0 == $1 ? $0.1 : $0.1 + 1)
        }
        return reduced.1
    }
}

(+)

extension에 where 문을 사용하면 특정 조건에서만 확장 기능을 사용할 수 있도록 제한할 수 있습니다.

Array를 확장하는데 Comparable을 채택한 타입만 아이템으로 사용할 수 있다는 코드입니다.

 

Question 5

func divide(_ dividend: Double?, by divisor: Double?) -> Double? {
    guard let dividend = dividene, let divisor = divisor else { return nil }
    guard divisor != 0 { return nil }
    
    return dividend / divisor
}

저는 역할에 따라 guard문을 나누는 것을 좋아해서

divisor != 0 을 따로 분리했습니다.

하나의 guard문에 작성해도 무방합니다.

 

Question 6

func divide(_ dividend: Double?, by divisor: Double?) -> Double? {
    if let dividend = dividene, let divisor = divisor, divisor != 0 { 
        return dividend / divisor
    }
    
    return nil
}

if let은 depth가 깊어지므로 하나에서만 쓰는 것을 좋아합니다.

 

Question 8

static을 이용하면 서브 클래스에서 illuminate를 오버라이딩하지 못하고

class를 이용하면 오버라이딩이 가능합니다.

 

Question 9

extension에는 저장 프로퍼티를 추가할 수 없습니다.

extension은 존재하는 타입에 새로운 행동을 추가할 수 있습니다.

타입 자체나 타입의 인터페이스를 변경하는 것은 불가능합니다.

만약 extension에 stored property를 추가하면 새 값을 저장하기 위한 새로운 별도의 메모리가 필요하기 때문에

이런 작업은 할 수 없습니다.

 

Question 10

프로토콜은 프로퍼티나 메서드를 요구하는 것에 대한 설계를 정의합니다.

클래스, 구조체, 열거형은 프로토콜을 채택하여 요구사항을 구현할 수 있습니다.

프로토콜은 함수를 직접 구현하지 않고 정의만 하며 프로토콜을 채택하여 추가적인 기능을 제공할 수 있습니다.

(+)

프로토콜은 함수를 정의만 하기 때문에 프로토콜의 요구 메서드는 Dynamic Dispatch로 동작합니다.

Swift는 프로토콜 지향 프로그래밍으로 필요한 부분을 프로토콜로 분리하여 관리합니다.

클래스의 상속을 대신해서 구조체에 프로토콜을 사용하면 성능 최적화를 할 수 있습니다.

 


아직은 초보 개발자입니다.

더 효율적인 코드 훈수 환영합니다!

공감 댓글 부탁드립니다.

 

 

반응형