seong_hye, the developer

오류 해결) Cannot use instance member ' ' within property initializer; property initializers run before 'self' is avaliable 해결 본문

IOS/Error

오류 해결) Cannot use instance member ' ' within property initializer; property initializers run before 'self' is avaliable 해결

seong_hye 2023. 8. 24.

 

⚠️

 Cannot use instance member ' ' within property initializer; property initializers run before 'self' is avaliable

: Swift에서 self를 사용해야 하는 프로퍼티를 초기화 도중에 접근하려고 할 때 발생하는 오류


🔍 발생한 경우

배열을 let으로 생성 후 다른 배열의 값으로 넣어주려고 하다가 발생

struct DataModel {
	let title: String
    let listData: [Int]
    let checkData: Bool
}

struct ContentView: View {
	var listData4: [1,2,3]
    var allList: DataModel = DataModel(title: "Value", listData: listData4, checkData: false) // error 발생
	
    var body: some View {
    	...
    }
}

✅ 해결 방안

- init()에서 초기화

init() 내부에서 self를 사용할 수 있음으로 오류가 발생하지 않음

struct ContentView: View {
	var listData4: [1,2,3]
    var allList: DataModel
    
    init() {
    	self.allList = DataModel(title: "Value", listData: listData4, checkData: false)
	}
    ...
}

 

- 값을 바로 대입

다른 값을 사용하지 않고 바로 해당 배열을 넣어서 해결하는 방안

단순하지만 복잡한 배열의 경우 오히려 눈에 잘 안 보임

struct ContentView: View {
    var allList: DataModel = DataModel(title: "Value", listData: [1,2,3], checkData: false)
    	...
}

 

- computed property로 제작

listData4가 바뀌면 allList도 자동으로 반영되도록 수정하는 방안

하지만 allList가 매번 계산되서 큰 데이터일 경우에는 비효율적일 수 있음

struct ContentView: View {
    var allList: DataModel { 	
    	DataModel(title: "Value", listData: listData4, checkData: false)
    }
    	...
}

✅ 사용한 방안

init()을 활용해 뷰가 뜰 때 값을 받아와서 사용할 수 있도록 하는 방안을 사용

다른 방안도 좋았으나 listData4의 값이 바뀔 경우 바로 적용하고

안전하게 받을 수 있는 방법이 init이라고 판단했기 때문


 

Comments