Wireframe

Swift 면접질문들

Swift 면접 질문이라는데… 난이도는 그리 높지 않은 편이다.

http://www.toptal.com/swift/interview-questions

1

다음 코드를 보고 질문에 답하시오

var array1 = [1, 2, 3, 4, 5]
var array2 = array1
array2.append(6)
var len = array1.count

2

다음 코드를 보고 질문에 답하시오

let op1: Int = 1
let op2: UInt = 2
let op3: Double = 3.34
var result = op1 + op2 + op3

혹은 다음과 같이 + 연산자를 오버로딩하는 방법도 있다.

func + (lhs:Int, rhs: Double) -> Double { return Double(lhs) + rhs }
var result = op1 + op2 + op3 // Double

3

아래 코드를 보고 질문에 답하시오.

var defaults = NSUserDefaults.standardUserDefaults()
var userPref = defaults.stringForKey("userPref")!
printString(userPref)
func printString(string: String) {
    println(string)
}
if let userPref = defaults.stringForKey("userPref") {
    printString(userPref)
}

4

Swift2.0에서부터 countElement() 함수는 제거되었다. CollectionType의 원소의 개수는 count 프로퍼티로 이동하였다. 문자열은 그 성격이 배열과 같은 집합은 아니므로 count 프로퍼티가 존재하지 않는다. 문자열의 글자의 수를 세고 싶다면 str.characters.count로 캐릭터맵의 원소의 개수를 이용한다.

5

6

AnyObject는 어떠한 클래스의 인스턴스라도 나타낼 수 있는 타입인데, 이는 내부적으로 프로토콜로 정의되어 있다. 이 때,

var array = [AnyObject]()
struct Test {}
array.append(Test())

이 코드는 컴파일 되지 않으며 다음과 같은 에러를 낸다.

Type 'Test' does not conform to protocol 'AnyObject'

그런데 다음 코드를 보면…

var array = [AnyObject]()
array.append(1)
array.append(2.0)
array.append("3")

7

struct Planet {
    var name: String
    var distanceFromSun: Double
}
let planets = [
    Planet(name: "Mercury", distanceFromSun: 0.387),
    Planet(name: "Venus", distanceFromSun: 0.722),
    Planet(name: "Earth", distanceFromSun: 1.0),
    Planet(name: "Mars", distanceFromSun: 1.52),
    Planet(name: "Jupiter", distanceFromSun: 5.20),
    Planet(name: "Saturn", distanceFromSun: 9.58),
    Planet(name: "Uranus", distanceFromSun: 19.2),
    Planet(name: "Neptune", distanceFromSun: 30.1)
]
let result1 = planets.map { $0.name }
let result2 = planets.reduce(0) { $0 + $1.distanceFromSun }

먼저 result1은 맵핑에 사용된 클로저의 타입이 Planet -> String이기 때문에 [String]으로 추론할 수 있으며, result2는 각 거리값의 합인데, Swift는 기본적으로 실수값을 Double로 추론하기 때문이다.

8

아래 코드를 보고 문제에 답하라.

class Master {
    lazy var detail: Detail = Detail(master: self)
    init() {
        println("Master init")
    }
    deinit {
        println("Master deinit")
    }
}
class Detail {
    var master: Master
    init(master: Master) {
        println("Detail init")
        self.master = master
    }
    deinit {
        println("Detail deinit")
    }
}
func createMaster() {
    var master: Master = Master()
    var detail = master.detail
}
createMaster()

이는 한쪽에서는 다른쪽에 참조수를 늘리지 않도록 weak, unowned 조절자를 써서 프로퍼티를 정의해야 한다.

class Detail {
    unowned var master: Master
    init(master: Master) {
        print("Detail init")
        self.master = master
    }
    ...
}

unowned는 옵셔널 타입에 쓸 수 없다. (값이 항상 있음을 가정함)

9

아래 코드를 보고 질문에 답하라.

struct IntStack {
  var items = [Int]()
  func add(x: Int) {
    items.append(x) // Compile time error here.
  }
}
struct IntStack {
  var items = [Int]()
  mutating func add(x: Int) {
    items.append(x) // Compile time error here.
  }
}
Exit mobile version