"Xcode No exact matches in call to initializer" error는 Xcode에서 Swift에서 매우 흔하게 발생하는 컴파일러 오류입니다. 이 오류는 주로 초기화하려는 객체의 생성자가 호출될 때, 전달된 인자가 해당 생성자와 일치하지 않을 때 발생합니다. 이 오류는 말 그대로 "초기화 구문 호출에 정확히 일치하는 것이 없다"는 의미입니다. 예를 들어, 생성자가 특정 타입이나 개수의 매개변수를 기대하는데, 다른 타입이나 개수의 값을 전달할 때 이 오류가 발생합니다. 즉, 코드가 특정 타입의 인스턴스를 생성(초기화)하려고 하지만, 제공된 인자(argument)들이 해당 타입이 가지고 있는 어떤 초기화 구문(initializer)과도 정확히 일치하지 않을 때 발생합니다.

주요 원인
- 인자 타입 불일치 (Type Mismatch) : 가장 흔한 원인으로 초기화하려는 객체에 전달하는 매개변수의 타입이 정확한지 확인한다. 타입이 맞지 않으면 해당 오류가 발생할 수 있다. 예로 초기화 구문이 String 타입을 예상하는데 Int를 전달하거나, Non-optional을 예상하는데 Optional을 전달하는 경우에 발생한다.
class Person {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
}
let person = Person(name: "jerry", age: "20") // 오류 발생
이 경우 age는 Int타입인데, String이 전달되어 오류가 발생한다. 이를 수정하기 위해 age를 Int로 전달한다.
let person = Person(name: "jerry", age: 20) // 정상 작동
- 인자 개수 불일치 (Argument Count Mismatch) : 초기화 구문이 요구하는 인자의 개수와 호출 시 제공된 인자의 개수가 다를 때 발생한다.
- 레이블 불일치 (Label Mismatch) : 초기화 구문이 특정 인자 레이블을 요구하는데, 호출 시 다른 레이블을 사용하거나 아예 사용하지 않을 때 발생한다. Swift의 초기화 구문은 인자 레이블을 포함하는 경우가 많다.
- 애매한 호출 (Ambiguous Calls) : 특정 하나의 타입에 여러 초기화 메서드가 존재할 때, 컴파일러가 어떤 초기화 메서드를 사용해야 할지 명확하게 판단하지 못하는 경우에 발생할 수 있다. 이 경우, 컴파일러에게 어떤 초기화 구문을 사용해야 하는지 명확히 알려주기 위해 타입을 명시적으로 지정하거나 인자 레이블을 정확히 일치시켜야 한다.
- Optional 값 문제 : Swift에서 Optional 타입(예: String?)과 Non-Optional 타입(예: String)은 서로 다른 타입이다. 초기화 메서드가 Non-Optional을 기대하는데 Optional 값을 전달하거나 그 반대의 경우에도 이 오류가 발생할 수 있다. textField.text의 경우 String?을 반환하므로, 이를 Double로 변환하려 할 때 Double 초기화 메서드가 String을 기대하면 오류가 발생할 수 있다.
- 프로토콜 불일치 또는 채택하지 않은 경우 : ForEach와 같이 특정 프로토콜(예: Identifiable)을 따르는 컬렉션을 요구하는 경우, 해당 컬렉션이 프로토콜을 따르지 않거나 id 매개변수를 올바르게 지정하지 않으면 오류가 발생한다.
- 제네릭 타입 제약 조건 (Generic Type Constraints) : 제네릭 타입을 사용하는 경우, 제네릭 타입에 대한 제약 조건(where 절)이 초기화 구문에서 예상하는 타입과 일치하지 않을 때 발생할 수 있다. 예를 들어, FloatingPoint를 기대하는데 BinaryFloatingPoint가 필요할 때와 같은 상황이다.
- @AppStorage 또는 UserDefaults 관련 문제 : @AppStorage와 같은 Property Wrapper를 사용할 때, 지원되는 데이터 타입이 제한적일 수 있다. 예를 들어, @AppStorage는 CGFloat를 직접 지원하지 않을 수 있어 Double로 초기화하고 필요할 때 CGFloat로 캐스팅해야 할 수 있다.
- 문법 오류 : 괄호나 쉼표 등 문법적으로 실수가 있을 시 오류가 발생한다.
해결 방법
- 인수 유형 및 개수 확인 : 초기화하려는 메서드들이 각각 어떤 타입과 개수의 인자를 필요로 하는지 확인한다.
- Xcode의 자동 완성(Auto-complete) 기능 활용 : 초기화 구문을 입력할 때 Xcode가 제공하는 자동 완성 목록 기능을 활용하여 올바른 초기화 메서드 형태를 확인하고 선택한다.
- 에러 메시지 자세히 읽기 : Xcode의 에러 메시지에 나타나는 제안을 잘 읽어본다. 이 경우 어떤 초기화 메서드가 필요한지, 어떤 초기화 구문이 일치하지 않는지, 어떤 타입이 문제인지 알려준다.
- 문서 확인 : Apple 개발자 문서나 해당 라이브러리의 공식 문서를 참조하여 사용하려는 타입의 초기화 구문 목록과 각 구문이 요구하는 인자들을 확인한다.
- 명시적 유형 변환 : 가장 일반적인 경우로, 전달하는 인자의 타입을 초기화 메서드가 예상하는 타입으로 명시적으로 변환한다. 만약 초기화하려는 값이 옵셔널 타입이라면, 강제로 언래핑을 하지 않고 안전하게 옵셔널 바인딩을 사용한다.
- Optional 값 처리 시 주의 : 강제 언래핑(!)은 nil일 경우 앱이 크래시 될 수 있으므로, Optional 값을 Non-Optional 초기화 메서드에 전달해야 하는 경우 nil 코얼레싱 연산자(??)를 사용하거나 if let 또는 guard let을 통해 안전하게 처리하는 것이 좋다.
- 컬렉션의 Identifiable 프로토콜 준수 확인 (ForEach 등) : ForEach와 같이 컬렉션을 사용하는 뷰의 경우, 컬렉션의 요소가 Identifiable 프로토콜을 준수하거나, id 매개변수를 통해 고유한 식별자를 제공해야 한다.
- 코드 검토 및 디버깅 : 문제가 되는 코드 라인을 중심으로 변수들의 타입이 예상과 일치하는지, Optional 값이 제대로 처리되고 있는지 등을 확인한다.
- 간단한 예시로 테스트 : 복잡한 코드에서 오류가 발생하면, 해당 부분을 최소화하여 간단한 예시로 만들어서 문제가 재현되는지 확인해 본다.
- 디폴트 생성자 사용 : 가능하다면, 디폴트 생성자를 사용하거나, 필요한 초기화 값만 전달하여 생성자를 호출할 수 있다.
- 문법 오류 : 괄호나 쉼표 등 문법적으로 실수가 없는지 다시 한번 확인해 본다.

이번 해당 오류의 경우 간단한 문법 오류였지만 오류 종류나 상황에 대해서 많이 확인할 수 있었다. 어떤 부분이 문제인지 몰라 서치 및 코드를 일일이 확인해야 했지만, 대부분의 "no exact matches in call to initializer" 오류는 Swift의 타입 안정성 때문에 발생하지만 초기화하려는 타입이 어떤 종류의 인자를 어떤 순서로 받아야 하는지 정확히 이해하고, 코드에서 그에 맞게 인자를 제공하며, 올바른 타입과 인자를 사용하도록 코드를 수정하면 쉽게 해결할 수 있다고 한다. Xcode의 자동 완성(Auto-complete) 기능을 활용하고 문법적으로 오류가 없는지 확인하며, 에러 메시지 자주 확인하는 습관을 가져야겠다.
'IOS > Error' 카테고리의 다른 글
| [Error] Failed to load repository owners (1) | 2025.08.11 |
|---|---|
| [Error] Thread 1: breakpoint 1.5 (4) | 2025.08.10 |
| [Error] [UIView setDataSource:] unrecognized selector sent to instance (0) | 2025.07.31 |
| [Error] Thread 1: Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value (5) | 2025.07.30 |