iOS Connect CoreData to Toggle

이미지
운영 체제: macOS Ventura 13.4.1 사용 버전: Xcode 14.3.1, Swift, SwiftUI ​ iOS Connect CoreData to Toggle을 알아보겠습니다. CoreData는 데이터를 저장하는 성질이 있습니다. Toggle은 상태에 따라 변경이 가능합니다. 일반적으로 Toggle을 사용하려면 @State를 사용하는데요. 문제는 CoreData의 값을 Toggle로 변경하고 싶을 때 발생합니다. ​ ​ 연결 방법은 다음과 같습니다. Toggle("", isOn:)에서 isOn 부분에 수동으로 Binding을 만들어 줍니다. 이렇게, Binding<Bool>을 적어주고,  get 부분에는 return으로 CoreData에 저장된 Bool 값을 넣거나, 아니면 45 번째 줄처럼 false을 넣습니다. 이 부분이 현재 Toggle의 상태를 나타내게 됩니다. set 부분에는 CoreData에 저장하는 과정을 넣습니다. 끝. 카테고리: iOS

iOS Play default sound as click a button

이미지
운영 체제: macOS Ventura 13.4.1 사용 버전: Xcode 14.3.1, Swift, SwiftUI ​ iOS Play default sound as click a button을 알아보겠습니다. ​ 버튼을 클릭할 때, 아무런 소리도 나지 않습니다. 너무 밋밋한데요. 키패드를 누를 때 나는 소리를 넣어 줄 수 있습니다. ​ AudioServicesPlaySystemSound()를 사용합니다. ​ ​ 우선, 9 번째 줄처럼 import AVFoundation을 해줍니다. 15 번째 줄처럼 AudioServicesPlaySystemSound()를 적어주고, 괄호 안에 숫자를 적습니다. 숫자가 각 소리에 해당하는 고유 ID입니다. 고유 아이디가 무슨 소리를 뜻하는지 알고 싶다면 아래 사이트를 확인해 주세요. https://iphonedev.wiki/index.php/AudioServices 끝. 카테고리: iOS

Mac Xcode set shortcut for find selected text

이미지
운영 체제: macOS Ventura 13.4.1 사용 버전: Xcode 14.3.1 ​ 맥 Xcode set shortcut for find selected text를 알아보겠습니다. ​ 기본적으로 Xcode에서 어떠한 단어를 찾을 때, 절차가 복잡합니다. Control(⌃) + Command(⌘) + Shift(⇧) + F가 기본적으로 전체 찾기인데, Android Studio 같은 경우에는 바로 선택된 글자가 검색창에 입력되어서 나타납니다. 하지만, Xcode는 검색 창만 나타나고 또다시 글자를 쳐야 합니다. UX가 별로라고 많이 느껴집니다. ​ Xcode에도 해당 기능이 존재하긴 하지만, 단축키가 설정되어 있지 않습니다. ​ Find - Find Selected Text in Project 단축키를 우리가 설정해 봅시다. Xcode - Settings...로 갑니다. Key Bindings로 가서 find selected를 검색합니다. 해당 부분에서 Key를 원하는 단축키로 설정합니다. 이제, 해당 기능을 단축키로 사용할 수 있습니다. 속이 시원하네요. ​ ​ 끝. 카테고리: Mac

iOS Play sound as click a button

이미지
운영 체제: macOS Ventura 13.4 사용 버전: Xcode 14.3.1, Swift, SwiftUI ​ iOS Play sound as click a button을 알아보겠습니다. ​ 버튼을 클릭할 때 소리가 재생되게 해보겠습니다. ​ 음악 파일을 끌어다 넣습니다. 그러면 아래와 같은 창이 나옵니다. ​ 반드시 Add to targets를 해줍니다. 아래와 같이 음악 파일이 들어가졌습니다. up_click.flac 파일이네요. 9 번째 줄처럼 AVFoundation을 import 합니다. 13 번째 줄에서 soundPlayer를 하나 만듭니다. AVAudioPlayer 타입입니다. 19 번째 줄에서 onAppear를 사용하여 초기화를 해줍니다. 20 번째 줄에서 soundPlayer가 nil 인지 확인합니다. 21 번째 줄에서 Bundle.main.url(forResource:, withExtension:)을 사용하여 url을 가져옵니다. forResource는 파일 이름을 넣어줍니다. withExtension에는 확장자를 넣어줍니다. 23 번째 줄에서 try를 사용하여 AVAudioPlayer를 정의합니다. 28 번째 줄에서 prepareToPlay()를 사용하여 재생할 준비를 합니다. Button을 클릭하면 소리가 나도록 합니다. 버튼 action 안에 play()를 넣습니다. 이제, 실행하면 소리가 납니다. ​ 만약 소리가 안 난다면, Target Membership이 체크되어 있는지 확인해 주세요. 끝. 카테고리: iOS

다른 사람을 보다

다른 사람을 보다 다른 사람을 볼 수 있을 때, 위대함은 시작된다. -노재화 『다이아몬드는 개똥밭에 굴러도 다이아몬드이다 5』, 부크크(2022), 20 쪽. 카테고리: My Book Story

iOS Minimum hit target size

이미지
운영 체제: macOS Ventura 13.3.1 사용 버전: Xcode 14.3 ​ iOS Minimum hit target size를 알아보겠습니다. ​ Human Interface Guidelines를 보면 버튼같이 사용자가 누를 수 있는 부분의 최소한의 크기를 알려줍니다. ​ ​ https://developer.apple.com/design/human-interface-guidelines/accessibility#Buttons-and-controls 44 x 44 pt가 최소 크기입니다. 이것보다 작을 때에는 사용자가 불편함을 느낀다고 합니다. ​ 끝. 카테고리: iOS

Algorithm Find a minimum distance in the array

이미지
알고리듬 Find a minimum distance in the array를 알아보겠습니다. 배열 안에서 어떤 지점에서 원소들 간의 거리가 최소인 경우를 알아봅시다. 1, 3, 9, 13, 105 이런 배열이 있다면 가장 최소가 되는 지점은 중앙값(Median)입니다. 위의 값은 9를 기점으로 각 원소의 거리를 측정하면 가장 짧습니다. 114가 가장 짧은 거리입니다. 만약 짝수 일 때는 어떻게 될까요? 가운데 양옆의 값의 평균을 구합니다. 그게 중앙값이 됩니다. 6이 중앙값이 되고, 거리는 18이 최소가 됩니다. 한 가지 재미있는 것은, 3~9 사이에 아무 값을 넣어도 거리는 최소라는 겁니다. 그 이유는 바로 6이 중앙값이지만, 3과 9 사이에 값들은 3 하고 가까워지면 동일하게 9에서 멀어지므로 값이 유지되고, 반대로 9와 가까워지면, 3 하고 멀어지면서 동일하게 유지됩니다. 코드로 봅시다. 3 번째 줄에서 중앙값을 구합니다. 끝. 카테고리: Algorithm

Algorithm linked list reverse order

이미지
알고리듬 linked list reverse order를 알아보겠습니다. ​ 링크드 리스트는 다음 구조체의 주소를 가지고 있는 구조체의 집합입니다. ​ 그림으로 보면 아래와 같습니다. 이 linked list를 역순으로 어떻게 만드는지 알아보겠습니다. ​ 노드는 이렇게 정의되어 있습니다. reverse_order라는 함수를 만듭니다. 이전 값을 연결해야 하므로 previous_node를 만들고, None을 넣습니다. 왜냐하면, 역순으로 보면 head가 마지막이기 때문입니다. current_node가 None이 아닐 때까지 반복합니다. 37 번째 줄에서 next_node에는 current_node의 next를 넣습니다. 38 번째 줄에서 기존의 current_node의 next의 연결을 끊고 previous_node로 연결합니다. 39 번째 줄에서 current_node를 previous_node로 만듭니다. 40 번째 줄에서 current_node를 next_node로 만들어주어 반복합니다. 끝나면 42 번째 줄에서 마지막 값이 저장된 previous_node를 반환합니다. 숨겨진 코드 때문에 아래 코드는 여러분 컴퓨터에서는 작동하지 않을 겁니다. 그냥 결과만 보여드릴게요. 끝. 카테고리: Algorithm

Algorithm Dijkstra algorithm without direction

이미지
알고리듬 Dijkstra algorithm without direction을 알아보겠습니다. ​ Dijkstra(다익스트라, 데이크스트라) 알고리듬은 최단거리를 구할 때 사용합니다. 각 지점 간의 거리를 계속해서 업데이트합니다. 이번 시간에는 방향성이 없는 경우를 다룹니다. ​ 개념은 간단합니다. 모든 경우에 대해서 경로 업데이트를 진행합니다. 이전에 지나갔던 길 보다 더 적은 값을 발견하면 다시 그 경로를 전체 탐색합니다. 더 이상 적은 값을 발견하지 못하면 프로그램은 종료되고 우리는 가장 최단 거리를 알게 됩니다. ​ ​ 다음과 같은 지도에서 3 -> 5로 가는 최단 경로를 구해봅시다. 각 지점 간의 관계는 다음과 같이 표시하기로 합니다. [시작 지점, 시간, 도착 지점] 예를 들어 3 번 지점의 경우 [3, 2, 1], [3, 5, 4]로 표현될 수 있습니다. ​ 지점은 총 5 개가 있고, 출발 지점은 3 번, 도착 지점은 5 번입니다. 맵은 다음과 같이 있습니다. 일단 모든 노드들의 관계를 저장할 리스트를 하나 만듭니다. adjacent로 만들었고, 노드의 수에 맞게 2 중 배열로 만듭니다. for 문으로 리스트에 해당하는 경로들을 넣어줍니다. 10 번째 줄에서 가는 경로를 넣고, 11 번째 줄에서 오는 경로를 넣습니다. searching이라는 함수를 만듭니다. 1 번째 줄에서 heapq, heappush, heappop을 불러옵니다. queue의 PriorityQueue를 사용해도 되는데, Thread 신경 안 쓰고 속도적인 측면만 필요하다면 heapq를 사용합니다. 5 번째 줄에서 시작 점에서 이동할 때 걸리는 모든 시간을 저장할 take_t...

더 좋은 세상

더 좋은 세상 세상을 더 좋게 만드는 데에는 두 가지 방법이 있다. 하나는 나쁜 사람들을 잡아넣는 것이고, 다른 하나는 좋은 사람들을 많이 만드는 것이다. -노재화 『다이아몬드는 개똥밭에 굴러도 다이아몬드이다 5』, 부크크(2022), 12 쪽. 카테고리: My Book Story