본문 바로가기

전체 글

(85)
[HIG] User Interaction: Haptics 햅틱은 사람의 터치 감각이 온스크린 인터페이스와 상호동작하는 경험을 향상한다. 예를 들어, Apple Pay 결제가 완료되면, 시스템은 시각적 및 청각적 피드백과 더불어 햅틱을 동작한다. 햅틱은 터치 제스처를 향상할 수도 있으며, 스위치를 토글하거나 피커를 스크롤링하는 상호동작을 향상할 수 있다. iPhone 모델은 여러 방법으로 앱에 햅틱을 추가할 수 있다. 표준 UI 요소를 사용하라. 시스템에서 기본적으로 제공하는 햅틱은 스위치(switches), 슬라이더(sliders), 그리고 피커(pickers)에서 작동한다. 피드백 생성기를 사용하여 미리 정의된 햅틱 패턴을 사용하라. 개발자를 위한 문서는 UIFeedbackGenerator를 참고하라. 더 많은 컨트롤을 원한다면, 여러분만의 햅틱 패턴을 구성..
Leetcode: Linked List Cycle, 연결 리스트 순환 판별 문제설명 연결 리스트의 head가 주어졌을 때, 리스트가 순환하는지 판별하라 문제풀이 fast runner, slow runner 이중 포인터 방법을 사용한다. slow runner는 노드를 한 번씩 이동하고, fast runner는 노드를 두 번씩 이동한다. 리스트가 순환이라면, slow runner와 fast runner는 반드시 만난다. public class ListNode { public var val: Int public var next: ListNode? public init() { self.val = 0; self.next = nil; } public init(_ val: Int) { self.val = val; self.next = nil; } public init(_ val: Int, ..
Leetcode: Palindrome Linked List, 연결 리스트 회문판별 문제설명 단일 연결리스트의 원소가 회문인지 판별하라 시간복잡도가 O(n)이면서 공간복잡도가 O(1)인 코드를 작성할 수 있다. 문제풀이 리스트의 중간 지점부터 끝까지 리스트를 거꾸로 만든다. 거꾸로 만든 리스트와 원본 리스트의 첫 번째부터 중간 지점까지 값이 같은지 판별한다. 리스트의 중간 지점을 찾아가기 위해, 연결리스트의 투 포인터 방법을 사용한다. public class ListNode { public var val: Int public var next: ListNode? public init() { self.val = 0; self.next = nil; } public init(_ val: Int) { self.val = val; self.next = nil; } public init(_ val:..
[HIG] User Interaction: Gestures iOS 기기를 사용하는 사람들은 터치스크린 제스처를 이용한다. 제스처는 컨텐츠와의 가까운 개인적 연결을 이끌어 내며, 스크린 위의 사물들의 직접적인 조작 느낌을 향상한다. 1. 가장 중요한 규칙으로서, 표준 제스처를 사용하라. 사람들은 표준 제스처에 친숙하다. 표준 제서츠로 가능한 행동을 다른 방식으로 동작하는 걸 배우길 꺼려할 것이다. 게임이나 다른 immersive 앱에서, 커스텀 제스처는 좋은 사용자 경험이 될 수 있다. 이외의 앱에서는, 표준 제스처(standard gestures)를 사용하여 사용자에게 다른 노력을 요구하지 않도록 해야 한다. 2. 표준 제스처를 비표준적인 행동을 동작하는데 사용하지마라. 게임을 위해 사용하는 것이 아니라면, 표준 제서츠러의 의미를 바꾸는 것은 사용자에게 혼동을 ..
Leetcode: Merge Two Sorted Lists, 두개의 정렬된 리스트 병합 문제설명 두 개의 정렬된 연결 리스트를 병합하고 정렬된 리스트를 반환하라. 노드의 길이는 최대 0부터 50개 까지다. -100 ListNode? { var node = ListNode(0) let head = node for element in arr { let newNode = ListNode(element) node.next = newNode node = newNode } return head.next } } // Implementation func mergeTwoLists(_ l1: ListNode?, _ l2: ListNode?) -> ListNode? { let MAX_LENGTH = 50 if l1 == nil { return l2 } else if l2 == nil { return l1 } ..
[HIG] App Architecture: Settings, 설정 모든 앱은 아니지만, 몇몇의 앱은 설정을 할 수 있어야 한다. 성공적인 앱들은 설정을 조절할 수 있는 간편한 방법들을 제공한다.. 대부분의 사람들이 예상하는 대로 동작하는 앱을 설계한다면, 설정의 필요성은 줄게 될 것이다. 1. 시스템을 통해 할 수 있는 것을 추론하라. 사용자, 기기, 환경에 대한 정보가 필요하다면, 사용자에게 묻지말고 시스템에 요구하면 된다. 예를 들어, 근처 지역의 선택 사항들을 제공하려고 한다면, 집 주소를 입력하는 대신 사용자의 현재 위치에 접근하도록 권한을 요청하자. 만약, 사용자가 개인 정보 접근에 거부한다면, 정해진 목록들로 대체하면된다. 2. 앱에서 설정 옵션들의 우선순위를 고려하라. 여러분의 앱의 메인 스크린 필수적이면서 자주 바뀌는 옵션들이 위치하기 장소이다. 부차적인..
Leetcode: Reverse Linked List, 연결 리스트 뒤집기 문제설명 단일 연결 리스트(Singly Linked List)의 노드를 역순으로 나열한 연결 리스트를 만든다. 재귀(recursive)와 반복(iterative) 방법이 있다. 문제풀이 반복문을 돌면서, 이전 값을 현재 가리키는 node의 next node로 할당한다. 옵셔널에 유의해야 한다. while 반복문을 돌며 옵셔널 바인딩을 사용하자. 반복문을 돌아 마지막에는 node 변수에 nil이 할당된다. 이 때, 마지막 반환 값이 nil이 되지 않도록 before 변수를 반환한다. public class ListNode { public var val: Int public var next: ListNode? public init() { self.val = 0; self.next = nil; } public..
[HIG] App Architecture: Requesting Permission, 권한 요청 앱이 사용자의 개인적인 정보에 접근하려면 사용자가 권한을 반드시 부여해야 한다. 개인적인 정보에는 현재 위치, 달력(Calendar), 연락처(contact information), 리마인더, 사진 등이 있다. 사용자는 이러한 민감한 정보에 접근하는 앱들이 편의성을 제공한다는 것을 인식하고 있지만, 사용자는 개인적인 정보를 제어하길 원한다. 예를 들어, 사용자는 근처의 친구를 찾거나 사진 태그에 실제 장소를 자동으로 달아주길 기대하면서도 이러한 기능들을 정지할 수 있는 옵션을 원한다. 언제 어떻게 사용자에게 개인 정보를 요구해야할까? 1. 앱이 반드시 필요로 할 때만 개인 정보를 요구하는 것이 좋다. 앱이 분명히 필요하지 않은 상황에서도 개인정보 접근을 요청한다면 의심을 받기 쉽다. 예를 들어, 날씨 앱..