iOS 에러!

[Swift/iOS] Missing argument for parameter 'from' in call 에러 분석하기!

녕이 2022. 9. 27. 17:31
728x90

 

이번에도 기초가 부족해서 생긴 에러! 분석해보고 다시는 이런 일이 없도록 해보자^^... (이렇게라도 부족한 기초.. 채우자 녕아..ㅎ)

 

이 에러가 발생하게 된 경위부터 거슬러 올라가 보자.

let category = CategoryResponse()

struct CategoryResponse: Decodable{
    let code: Int
    let message: String
    let result: String
}

//Result 생략

 

Codable 구조체를 만들어서 새로운 객체를 선언해줬다. 이 경우 에러가 발생하는데, 이는 이 객체 struct, class를 초기화하지 않았기 때문이다. Swift 내에 있는 모든 객체는 초기화를 해줘야 한다.

 

class의 경우, 이니셜 라이저를 꼭 정의해줘야 하지만, struct의 경우 따로 정의하지 않아도 된다. swift가 해준다. 그런데 이니셜 라이저는 protocol extension을 통해 생성되기도 하는데, 만약 struct에 protocol(Codable 같은)을 상속받았다면 추가적으로 초기자를 선언해준다. 그래서 아래와 같은 에러 메시지가 발생한 것!

 

Missing argumnet for parameter 'from' in call. Insert 'from: <#Decoder#>'

객체( ) 이 괄호 안에 from: 파라미터에 대한 인자를 작성하라고

 


 

컴파일러는 Codable로부터 내가 이니셜 라이저를 호출하길 제안했지만, 정작 나는 그것을 원하지 않는다! 그러므로 구조체에 대한 나만의 initializer를 정의해주거나, 모든 구조체 멤버의 default value를 선언해주면 된다.

 

init(code:Int, message:String, result: String){
    self.code = code
    self.message = message
    self.result = result
}

 

이런 식으로 이니셜 라이저를 만들어주고

 

let category = CategoryResponse(code: 0, message: "", result: "")

 

이렇게 해주면 된다! struct 안에 struct가 있는 중첩 구조체가 있을 수도 있는데 이런 경우는 그 구조체에도 이니셜라이저를 만들어서 안에 중첩으로 넣어주면 된다..^^

 

간단하지만 꼭 알아야 하는 지식! 

분명 알고 있는데 역시 실제로 해볼 때랑은 다른 것 같다... 호달달

 

 

참고

https://stackoverflow.com/questions/66916479/missing-argument-for-parameter-from-in-call-insert-from-decoder

 

Missing argument for parameter 'from' in call. Insert 'from: <#Decoder#>'

I am trying to create a new instance of a codable struct @State private var parcel = Parcel() but I'm getting this error: Missing argument for parameter 'from' in call Insert 'from: <#Decoder#...

stackoverflow.com

 

728x90