11월, 2022의 게시물 표시

iOS Make a custom Property List

이미지
운영 체제: macOS Ventura 13.0.1 사용 버전: Xcode 14.1, Swift, SwiftUI ​ iOS Make a custom Property List를 알아보겠습니다. 코드 상에 직접 입력하는 하드코딩 방식보다는 plist 파일에 따로 넣어 관리하는 방법이 있습니다. 이렇게 하면 하드코딩보다는 조금 유연하고 plist 파일이 노출되지 않는다면 하드코딩보다 나은 보안성을 가질 수 있습니다. ​ File - New - File...을 눌러줍니다. Property List를 선택합니다. 적당한 이름으로 만듭니다. 이러한 파일이 생성됩니다. +를 눌러줍니다. 사용할 Key 이름을 적어줍니다. 저는 MyKeyValue로 만들었습니다. 타입을 선택합니다. 저는 String입니다. Value에는 키에 해당되는 값을 적습니다. 저는 안녕하세요. Bonjour를 적었습니다. Swift 파일로 옵니다. myKeyValue를 만들고 get 안에다가 불러오는 것들을 적습니다. 12 번째 줄에서 url을 가져옵니다. 16 번째 줄에서 dictionary 형식으로 plist를 변환합니다. 20 번째 줄에서 String으로 만들고 반환합니다. 실행해 봅시다. 끝. 카테고리: iOS

iOS Multiple types in decode

이미지
운영 체제: macOS Ventura 13.0.1 사용 버전: Xcode 14.1, Swift ​ iOS Multiple tyipes in decode를 알아보겠습니다. 원래라면 서버에서 같은 타입의 데이터를 Json으로 보내줘야 하는데, 공공 API를 사용하다 보면, 이상하게 오류가 발생합니다. 그래서 들여다보면 타입이 자기 멋대로 달라지는 것을 볼 수 있습니다. 난감합니다. 실제 서버 담당자를 만날 수 있다면 수정해 달라고 요청하면 되지만, 공공 API의 경우 아마 접촉하기가 힘들 겁니다. 그냥 우리가 맞춰 줘야죠.... ​ 아래는 어떤 API의 응답 Json입니다. routeno가 Int 형태인 걸 볼 수 있습니다. 하지만, 아래를 보시죠. 같은 API인데 이번엔 String 형식으로 옵니다. 이럴 거면 그냥 처음부터 String으로 보내지. 답답하네요. API 응답을 위한 Struct 들을 만들어 줍니다. 모르겠으면 아래 게시글을 참고해 주세요. https://shwoghk14.blogspot.com/2022/08/ios-json-decoding-to-struct.html 우리는 47 번째 줄에서 routeno: Int를 수정할 겁니다. 파일을 하나 만듭니다. File - New - File...을 누릅니다. Swift File을 선택합니다. 적당한 이름으로 하나 만듭니다. enum으로 하나 만듭니다. 그리고 Decodable을 상속받습니다. Init을 만듭니다. container를 불러오고, container로 각각 모든 타입을 try로 실행합니다. Return 값은 해당 타입의 case로 반환합니다.

iOS Swift ForEach vs For in

이미지
운영 체제: macOS Ventura 13.0.1 사용 버전: Xcode 14.1, Swift ​ iOS Swift ForEach vs For in을 알아보겠습니다. ForEach와 For in은 반복문에 사용되는 문법들입니다. 이 둘의 차이점은 무엇인지 알아보겠습니다. ​ ​ 우선, 속도 관련된 사항입니다. forEach와 for in의 속도는 같습니다. 아래는 forEach의 소스 코드입니다. for in이 사용되네요. 뭐가 더 빠르다 하는 건 믿지 마세요. https://github.com/apple/swift/blob/main/stdlib/public/core/Sequence.swift#L785 애플의 문서에 적혀있는 내용입니다. https://developer.apple.com/documentation/swift/array/foreach(_:) 같은 점은 항목들을 돌면서 반복한다는 점입니다. 다른 점은 for 문은 break나 continue, return 등으로 조작이 가능하고, forEach의 경우는 이러한 것으로 반복문을 제어하지 못합니다. ​ 그리고 forEach의 경우 closure를 사용하기 때문에 chain처럼 연결해서 사용할 수 있습니다. 이것을 for in으로 하려면 귀찮아집니다. 하지만, 만약에 map 함수 뒤에 오는 반복문에 break나 continue 등의 제어가 필요하다면 for in을 써야 합니다. ​ 끝. 카테고리: iOS

iOS Make an underlined segmented picker

이미지
운영 체제: macOS Ventura 13.0.1 사용 버전: Xcode 14.1, SwiftUI, Swift, UIKit ​ iOS Make an underlined segmented picker를 알아보겠습니다. ​ 밑줄이 쳐진 segmented picker를 만들어 보겠습니다. ​ ​ 정렬을 하나 만듭니다. 방법은 아래 게시글에 있습니다. https://shwoghk14.blogspot.com/2022/11/ios-make-pageviewcontroller.html 현재 선택된 것을 알려주는 currentIndex를 추가해 줍니다. pages에는 picker에 들어갈 것들을 적습니다. VStack을 만들고 정렬은 위에서 만든 centerOveerlapAlignment를 적습니다. 이 VStack 안에 HStack을 만듭니다. 그리고 ForEach를 통해서 버튼을 하나씩 그립니다. 버튼을 클릭하면 현재 인덱스가 버튼의 인덱스로 변경됩니다.  버튼의 label에는 32 번째 줄처럼 if 문을 사용합니다. 선택한 것과 그려지는 버튼이 동일하다면 여기서 alignmentGuide를 줍니다. 이 뜻은 이 버튼을 기준으로 하겠다는 뜻입니다. 즉, 이 버튼이 우리가 만든 centerOverlapAlignment의 기준점이 되는 겁니다. 35 번째 줄에서 viewDimen에 HorizontalAlignment.center를 리턴합니다. 이것은 이 return 값만큼 기준점을 옮기는 역할을 합니다. 37 번째 줄 else에서 선택된 버튼이 아니라면 그냥 그립니다. 그리고 HStack이 끝나는 지점에 Underline을 위한 사각형을 하나 만듭니다. 실행

iOS Segmented Picker with PageViewController

이미지
운영 체제: macOS Ventura 13.0.1 사용 버전: Xcode 14.1, SwiftUI, Swift, UIKit ​ iOS Segmented Picker with PageViewController를 알아보겠습니다. Segmented Picker를 사용해서 PageViewController의 PageView를 조정해 보겠습니다. ​ ​ 먼저 아래 글을 참고하여 PageViewController를 만들어 줍니다. https://shwoghk14.blogspot.com/2022/11/ios-make-pageviewcontroller.html 그다음, Picker를 만들어야 합니다. Picker에 들어갈 enum을 만듭니다. 저는 pages 순서와 동일하게 만들었습니다. 그 뒤, 17 번째 줄처럼 State 변수를 하나 만들고 초깃값을 .hello로 줬습니다. 22 번째 줄 body에는 VStack을 주고, Picker를 넣어줍니다. Picker에는 설명 값이 들어가고 selection에는 아까 만든 State 변수가 들어갑니다. 각 Text에는 Text에 맞는 태그들을 붙여줍니다. 실행하면 다음과 같습니다. 방금 만든 건 Segmented Picker가 아닙니다. 30 번째 줄처럼 pickerStyle에 .segmented를 넣습니다. 실행하면 다음과 같습니다. 이제 이 Segmented Picker에 PageViewController를 연결할 겁니다. ​ ​ ​ ​ PageViewController.swift 파일에 현재 페이지 위치 정보를 가질 변수를 하나 만듭니다.

iOS Make a PageViewController

이미지
운영 체제: macOS Ventura 13.0.1 사용 버전: Xcode 14.1, SwiftUI, Swift, UIKit ​ iOS Make a PageViewControlle를 알아보겠습니다. SwiftUI에서 PageView를 만들 건데요. PageViewController를 직접 사용할 수는 없습니다. UIViewRepresentable 등을 사용해야 합니다. ​ ​ 아래 게시글을 참고하여 UIViewRepresentable을 하나 만들어 줍니다. https://shwoghk14.blogspot.com/2022/11/ios-using-uikit-on-swiftui-with-delegate.html 만들어진 swift 파일은 대략 아래와 같습니다. 20 번째 줄 makeUIViewController의 반환 타입은 UIPageViewController입니다. 21 번째 줄 UIPageViewController()에는 transitionStyle 전환 방식, navigationOrientation 스크롤 방향(가로, 세로) 항목이 들어갑니다. 38 번째 줄 controllers에는 parent의 pages가 UIHostingController()를 사용하여 배열로 들어갑니다. UIHostingController는 UIKit에 SwiftUI를 띄울 때 사용합니다. 즉 PageView로 띄울 뷰들이 SwiftUI 뷰들이라는 뜻입니다. 43 번째 줄 pageViewController(viewControllerAfter)는 다음 화면으로 넘겼을 때 실행됩니다. 47 번째 줄 pageViewController(viewControllerBefore)는 이전 화면으로 넘겼을 때 실행됩니다. ​ ​

iOS Make a custom alignment

이미지
운영 체제: macOS Ventura 13.0 사용 버전: Xcode 14.1, SwiftUI, Swift ​ iOS Make a custom alignment를 알아보겠습니다. Swift에서 정렬을 사용할 수 있는데요. 사용하고자 하는 정렬이 제공되지 않을 때, 개발자가 직접 정렬을 구현할 수 있습니다. ​ 파일을 하나 만듭니다. File - New - File...을 누릅니다. Swift File을 누릅니다. 적당한 이름으로 하나 만듭니다. import SwiftUI를 해줍니다. 그리고 struct를 하나 만듭니다. AlignmentID를 상속받습니다. static func defaultValue를 사용합니다. context는 현재 뷰의 크기를 나타냅니다. 반환하는 CGFloat 값은 정렬될 위치를 나타냅니다. context의 3분의 1 위치에 정렬이 될 겁니다. extension을 사용하여 CustomAlignment를 HorizontalAlignment 안에 집어넣습니다. 적용해 봅시다. 기본 정렬 상태입니다. 13 번째 줄 VStack에 우리가 만든 정렬을 사용합니다. 대략 1/3 지점에 정렬된 것을 보 실 수 있으신가요? ​ ​ 끝. ​ 카테고리: iOS