Model 데이터 변수가 옵셔널이고 Binding시 unwrapping 하는 방방임..

 

import SwiftUI

/*
 MARK: Binding 변수가 optional 일 경우 unwrapping 해서 사용가능하게 함.
 타입별로 추가해서 사용하면됨.
 */

// Bool unwrapping
extension Binding where Value == Bool? {
    func onOptional(_ fallback: Bool) -> Binding<Bool> {
        return Binding<Bool>(get: {
            return self.wrappedValue ?? fallback
        }) { value in
            self.wrappedValue = value
        }
    }
}

// String unwrapping
extension Binding where Value == String? {
    func onOptional(_ fallback: String) -> Binding<String> {
        return Binding<String>(get: {
            return self.wrappedValue ?? fallback
        }) { value in
            self.wrappedValue = value
        }
    }
}

// Int unwrapping
extension Binding where Value == Int? {
    func onOptional(_ fallback: Int) -> Binding<Int> {
        return Binding<Int>(get: {
            return self.wrappedValue ?? fallback
        }) { value in
            self.wrappedValue = value
        }
    }
}

 

[사용방법]

 

$searchTags[index].isSelected.onOptional(false) 

isSelected 변수가 옵셔널이라 그냥 바인딩하면 오류를 뿜어냄..

뒤에 onOptional(false) 붙이면 unwrapping 되서 바인딩됨. false값은 unwrapping시 실패할 경우 default 값임.

ForEach(searchTags.indices, id: \.self) { index in
    
    if let tag = searchTags[index].hashtag {
        TagTogleButton(isSelected: $searchTags[index].isSelected.onOptional(false),
                       tag: tag) { tag in

            tagSelectedCloser(tag)
            
        }
    }
}

+ Recent posts