Project10의 두 번째 포스팅입니다.
저번 게시글에 이어서 만들어 보겠습니다.
컬러 익스텐션 만들기
이번에는 컬러 익스텐션을 만들어서 컬러를 다루도록 하겠습니다. SwiftUI
에서는 일명 HEX 코드
를 그냥 사용할 수 없습니다. 그렇기 때문에 값을 추출해 변환하는 기능을 추가해야만 합니다. 따라서 헥스 코드를 입력받아 Color
타입을 만들어내는 생성자를 추가해주겠습니다.
이 앱에서 자주 쓰일 색을 아래와 같이 추가해주겠습니다.
// ColorExtension import SwiftUI extension Color { static let lightRed = Color(hex: "c64756") static let DarkGreen = Color(hex: "00587a") static let deepgray = Color(hex: "6e6e6e") static let primartShadow = Color.primary.opacity(0.5) static let background = Color(UIColor.systemGray6) } extension Color { //헥스(HEX) 코드 활용 init(hex: String) { let scanner = Scanner(string: hex) // 문자열 파서 역할을 하는 클래스 _ = scanner.scanString("#") // scanString은 iOS 13부터 지원. var rgb: UInt64 = 0 //문자열을 Int64 타입으로 변환해 rgb 변수에 저장. 변환할 수 없다면 0을 반환함 scanner.scanHexInt64(&rgb) let r = Double((rgb >> 16) & 0xFF) / 255.0 // 좌측 문자열 2개 추출 let g = Double((rgb >> 8) & 0xFF) / 255.0 // 중간 문자열 2개 추출 let b = Double((rgb >> 0) & 0xFF) / 255.0 // 우측 문자열 2개 추출 self.init(red: r, green: g, blue: b) } }
이렇게 색을 설정해줬으니 이제 ProductRow.swift
파일로 돌아가서 색을 아래와 같이 수정하겠습니다.
.foregroundColor(Color.red) -> .foregroundColor(.lightRed) .foregroundColor(Color.green) -> .foregroundColor(.DarkGreen) .shadow(color: Color.primary.opacity(0.3)) -> .shadow(color: .primaryShadow, radius: 1, x: 2, y: 2)
Product 모델 적용
이제 ProductRow
에서 사용한 캐릭터명과 정보 등에 코딩된 값을 바꿔주겠습니다.
Product 모델 생성
새로운 [Swift File
] 템플릿을 생성하고 이름은 Product.swift
라고 정해주겠습니다. 그리고 데이터를 담을 Product
타입을 아래와 같이 구현하겠습니다.
// Product import SwiftUI struct Product { let id: UUID = UUID() let name: String let ImageName: String let movie: String let price: Int let description: String var isFavorite: Bool = false }
그리고 그 아래에는 ProductList
변수에 간단한 Product
데이터를 만들어 넣어주겠습니다. 이것은 프리뷰에서 테스트용으로 사용하는데 유용하게 사용할 수 있습니다.
// Product let ProductList = [ Product(name: "소스케", ImageName: "Sosuke", movie: "벼랑위의 포뇨", price: 124000, description: "5살 남자 아이. 본작품의 주인공. 벼랑 위에 있는 2~3층 정도 되는 주택에서 엄마와 함께 살고 있다."), Product(name: "포뇨", ImageName: "Ponyo", movie: "벼랑위의 포뇨", price: 134000, description: "귀여운 물고기. 햄을 굉장히 좋아하며, 자신에게 적대적인 태도를 보이는 사람 에게는 입으로 물총을 쏴서 응수한다."), Product(name: "소피아", ImageName: "Sophia", movie: "하울의 움직이는 성", price: 102000, description: "어린 소녀지만 마법 때문에 90살의 늙은 할머니 모습이 되어버렸다. 하지만 삶을 여유롭게 포용할 수 있는 마음의 소유자."), Product(name: "하울", ImageName: "Howl", movie: "하울의 움직이는 성", price: 134000, description: "움직이는 성의 주인이자 뛰어난 마법사. 잘생긴 외모로 여성들의 심장을 빼앗아간다는 으스스한 소문의 주인공이기도 하다."), Product(name: "캘시퍼", ImageName: "Calcifer", movie: "하울의 움직이는 성", price: 104000, description: "하울이 어렸을 때 하울과 계약을 맺고 하울의 심장을 가진 대신, 하울의 성에 묶여 동력원 겸 관리자가 된다.") ]
Product 모델 활용
이제 만들어준 모델을 ProductRow.swift
파일에서 Product
프로퍼티를 만들고, 하드코딩되어 있던 값을 찾아서 아래와 같이 수정합니다.
// ProductRow Struct Product: View { let product: Product var productImage: some View { Image("Sosuke") -> Image(product.ImageName) } var productDescription: some View { Text("소스케") -> Text(product.name) Text("5살 남자 ... 있다.") -> Text(product.description) } var footerView: some View { Text("벼랑위의 포뇨") -> Text(product.movie) } }
이렇게 product
프로퍼티를 추가했으니 ProductRow
를 생성할 때 초깃값을 지정해줘야 합니다. ProductRow
가 사용되는 프리뷰와 Home.swift
파일의 코드를 아래와 같이 수정하겠습니다.
// ProductRow struct ProductRow_preview: PreviewProvider { static var previews: some View { ProductRow(product: ProductList[0]) } }
// Home struct Home: View { var body: some View { VStack(spacing: 0) { ProductRow(product: ProductList[0]) ProductRow(product: ProductList[1]) ProductRow(product: ProductList[2]) ProductRow(product: ProductList[3]) ProductRow(product: ProductList[4]) } } }
이제 Home.swift
파일에서 프리뷰를 확인해보면 전달받은 데이터에 따라 다른 결과가 나타나는 것을 확인할 수 있습니다.

읽어주셔서 감사합니다🤟
'PROJECT > Simple' 카테고리의 다른 글
SwiftUI Project10 : 영화 캐릭터 정보 앱 #4 - 디테일뷰 (3) | 2021.04.20 |
---|---|
SwiftUI Project10 : 영화 캐릭터 정보 앱 #3 - JSON (0) | 2021.04.19 |
SwiftUI Project10 : 영화 캐릭터 정보 앱 #1 (0) | 2021.04.16 |
SwiftUI Project9 : CustomTabView (geometryReader) (0) | 2021.03.26 |
SwiftUI Project8 : WebView and Image (0) | 2021.03.21 |