전체 글13 ForEach의 ID [SwiftUI] ForEach View를 사용할 때 ID로 \.self를 넣어주고는 한다. struct ContentView: View { let colors: [Color] = [.red, .green, .blue] var body: some View { VStack { ForEach(colors, id: \.self) { color in Text(color.description.capitalized) .padding() .background(color) } } } } ForEach로 생성되는 각 뷰들이 생성되거나 삭제될 때 그 부분만 업데이트하기위해 ID값을 통해서 뷰를 구별한다. 이를 위해서 id인자를 넣어주게 된다. public init(_ data: Data, id: KeyPath, @ViewBuilder co.. 2023. 8. 31. keyPath의 함수기능 User 구조체를 정의하고 그 배열을 만들자 struct User { let email: String let isAdmin: Bool } let users = [User(email: "A", isAdmin: true), User(email: "B", isAdmin: false), User(email: "C", isAdmin: true), User(email: "D", isAdmin: false)] 그리고 map을 이용해서 email이나 isAdmin값을 가져오거나 filter를 사용하려면 클로저를 전달해야한다. users.map{$0.email} users.map{$0.isAdmin} users.filter{$0.isAdmin} 하지만 keyPath를 함수처럼 사용해서 더 예쁘게 작성할 수 있다. use.. 2023. 8. 31. UIImageView를 Image 크기에 맞추기 [Swift] 문제점: UIImageView에서 scaleToFit 설정을 준 후, constraint를 통해 width가 화면 뷰에 맞도록 고정시켰다. 하지만 UIImagView의 크기가 줄어들지 않아 남는 여백이 생겨 UIImageView를 Image 크기에 맞게 AutoLayout을 설정하려 한다. 해결법: 1. Image의 비율을 저장한다. 2. AutoLayout의 height 설정에서 저장한 비율을 이용해 UIImageView의 width값으로 height값을 구해 AutoLayout을 설정한다. private let postImageView: UIImageView = { let iv = UIImageView() iv.contentMode = .scaleAspectFit iv.layer.borderWidth.. 2023. 8. 26. 비동기 함수 여러개 호출 후 completionHandler 호출 비동기 함수를 하나만 사용할 때에는 그냥 completionHandler를 사용하면 되지만, 비동기 함수를 여러개 호출 후 가장 마지막에 끝나는 함수가 종료된 후에 completionHandler를 호출시킬 수 있다. 어떤 상황이냐면, 비동기 함수를 하나만 호출할 때는 completionHandler에 함수가 종료된 후 호출될 함수를 넣어주면 정상적으로 동작하지만, 여러개의 비동기 함수를 호출했을 때(for문을 써서 호출하는 등)의 상황을 보면 저런식일거다. 비동기함수는 먼저 호출한 함수가 먼저 종료된다는 보장도 되어있지 않고, for문을 이용해서 같은 함수를 보낸다면 어떤 한 함수에만 completionHandler를 넣어주는것도 이상하고 원하는 대로 작동한다는 보장도 되어있지 않을것이다. 그렇다고 모.. 2023. 8. 21. 이전 1 2 3 4 다음