UIViewController

 

Apple Developer Documentation

 

developer.apple.com

UIViewController

An object that manages a view hierarchy for your UIKit app.
UIKit으로 제작된 앱의 뷰계층구조를 관리하는 객체. UIKit으로 앱개발을 하게되면 가장 먼저, 그리고 가장 많이 마주하게 될 클래스이다. 
화면위에 보여지게될 UIView들의 로직과 관리를 담당하게 된다. 그렇다면 UIView는 무엇일까? 
 
UIView
 

Apple Developer Documentation

 

developer.apple.com

UIView

An object that manages the content for a rectangular area on the screen.

화면 위의 콘텐츠를 관리하기 위한 사각형 영역 객체를 UIView라고 정의하고 있다. 즉 사용자에게 보일 UILabel, UIButton과 같은 화면 구성요소들을 모두 UIView라고 하고 이러한 객체들을 관리하기 위한 객체가 UIViewController이다.

 

UIViewController에 대해 이어서 설명하자면 UIViewController가 하는 대표적인 일은 다음과 같다.

  • 뷰의 컨텐츠 업데이트, 주로 기본 데이터의 변경에 반응.
  • 뷰와 사용자간의 상호작용에 반응.
  • 전반적인 인터페이스 레이아웃 관리 및 뷰의 사이즈 조정
  • 다른 컨트롤러와의 화면 전환

뷰 컨트롤러는 연결되어있는 화면의 가시성(visibility)에도 관여하게 된다. 즉 화면이 나타나고 사라지는 생명주기 단계에 해당되는 함수를 자동적으로 호출한다.

그림에 표현된 것 이외에도 생명주기에 관련된 함수가 몇 가지 더 있지만 해당 부분은 생명주기에 대한 자세한 글로 적으려 한다. 

 

정리해서 말하자면 UIViewController는 화면을 관리하는 하나의 단위라고 설명하고싶다.

 

많은 종류의 UIViewController가 있지만 크게 두 가지 유형으로 나뉜다.

ContentViewController

가장 기본적인 뷰 컨트롤러로서 하나의 화면을 담당하고 그 안에서의 UIView 객체에 대한 생성과 관리를 맡으며 사용자와의 상호작용을 담당한다.

ContainerViewController

하나 이상의 뷰 컨트롤러를 관리하는 뷰 컨트롤러. 하나 이상인 컨트롤러의 레이아웃, 화면 전환을 담당한다.

대표적으로 UINavigationController, UITabBarController 및 UISplitViewController 등이 있다.

 

참고 글

https://velog.io/@swiftist9891/UIView-UIViewController

https://www.acmicpc.net/problem/12851

 

12851번: 숨바꼭질 2

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때

www.acmicpc.net

숨바꼭질 시리즈이다. 그래프 탐색으로 접근 가능한 문제다. 

 

풀이

실수를 유발하게 하는 포인트가 몇가지 있다. 우선 문제에 동생과 수빈이가 위치한 좌표만 적혀있을 뿐 어디까지 이동이 가능한지 제약이 적혀있지 않다. 즉 동생의 좌표 최댓값 100000보다 더  큰 범위로 순간이동 후 걸어와서 발견하는 방법이 존재한다는 것이다. 역으로 돌아오는 것은 걸어오는 방법(-1) 밖에 없기에 최대 유효 범위는 100001이다. 그보다 큰 위치에서 돌아오는 방법은 최소 시간을 갱신할 수 없다. 따라서 100002개의 배열을 생성한 뒤 한 칸 후퇴, 한 칸 전진, 두배 순간이동의 방법으로 너비 우선 탐색을 수행하면 된다. 

다음으로 중요한 부분은 같은 시간이 걸리더라도 걸어가서 동생을 마주하는 방법과 순간이동으로 마주하는 방법은 다르게 계산해야한다는 점이다. 따라서 도달하게 된 시간이 같다면 도달 방법 수 갱신만 하지 말고 다음 탐색 큐에 담아주어야 한다.

마지막으로 이동하지 않는 것도 방법으로 세야 한다는 것이다. 즉 처음부터 동생과 수빈이의 위치가 같은 경우라면 1을 반환해야 한다.

 

정답 코드

'Problem Solving > BOJ' 카테고리의 다른 글

[11559] Puyo Puyo  (0) 2022.12.05
[17070] 파이프 옮기기 1  (8) 2022.12.01
[2096] 내려가기  (0) 2022.11.29
[3649] 로봇 프로젝트  (0) 2022.11.26
[1916] 최소비용 구하기  (0) 2022.11.25

https://www.acmicpc.net/problem/2096

 

2096번: 내려가기

첫째 줄에 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 숫자가 세 개씩 주어진다. 숫자는 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 중의 하나가 된다.

www.acmicpc.net

처음엔 그래프 탐색으로 접근했지만, DP로 해결한 문제다.

 

풀이

최대 점수를 담는 3칸 크기 배열과 최소 점수를 담는 3칸 크기 배열을 생성한 뒤 매 입력마다 최대, 최소 점수를 누적해 나가면 된다.

단, 갱신되는 주체가 무엇인지를 잘 생각해야한다. 예제를 기준으로 표를 그려봤다.

첫 입력은 당연히 그대로 입력받고 두번째 입력부터 비교를 시작한다. 현재 입력값 기준으로 이전 입력값들의 비교를 통해서 값을 경신해야 한다. 본인은 아무 생각 없이 이전 배열을 기준으로 새로 입력받은 값을 경신해서 오답을 받았다.

마지막 결과인 [12 18 19] 배열 중 가장 큰값이 최댓값이 된다. 최솟값은 반대로 최솟값들로 연상하여 갱신하면 된다.

 

정답 코드

'Problem Solving > BOJ' 카테고리의 다른 글

[17070] 파이프 옮기기 1  (8) 2022.12.01
[12851] 숨바꼭질 2  (0) 2022.11.30
[3649] 로봇 프로젝트  (0) 2022.11.26
[1916] 최소비용 구하기  (0) 2022.11.25
[1105] 팔  (0) 2022.11.24

https://www.acmicpc.net/problem/3649

 

3649번: 로봇 프로젝트

각 테스트 케이스마다 한 줄에 하나씩, 구멍을 완벽하게 막을 수 있는 두 조각이 없다면 'danger'를 출력한다. 막을 수 있는 경우에는 'yes ℓ1 ℓ2'를 출력한다. (ℓ1 ≤ ℓ2) 정답이 여러 개인 경우에

www.acmicpc.net

투 포인터 문제다. 예전에 런타임 에러를 마주하고 해결하지 못해 포기했다가 최근에 다시 봐서 해결한 문제. 

 

풀이

입력된 레고를 길이 순으로 정렬한 뒤 처음과 끝에서 탐색하면서 범위를 좁히면 된다. 탐색 도중 조건이 맞으면 바로 결과를 출력. 대신 테스트 케이스의 제한이 안 적혀있어 결과물을 모아서 한 번에 출력했다. 스위프트의 print() 메서드가 다른 언어에 비해 속도가 느리기 때문에 출력 양이 많은 경우에는 이런 식으로 해결하는 경우가 많다.

 

정답 코드

주석처리 부분이 런타임에러 코드의 수정 전 부분이다. 무한 입력을 받기 위해 while let 문을 사용했는데, 마지막 입력없이 끝나는 부분에서 공백 문자열에 대해 정수형 변환이 일어나 런타임 에러가 일어나지 않았나 생각해본다. xcode에서는 아무 문제없이 빌드되길래 다른 케이스에서 인덱스 오류인 줄 알고 여러 번 삽질했다..

'Problem Solving > BOJ' 카테고리의 다른 글

[12851] 숨바꼭질 2  (0) 2022.11.30
[2096] 내려가기  (0) 2022.11.29
[1916] 최소비용 구하기  (0) 2022.11.25
[1105] 팔  (0) 2022.11.24
[12015] 가장 긴 증가하는 부분 수열2  (0) 2022.11.23

UserDefaults

https://developer.apple.com/documentation/foundation/userdefaults#1664798

 

Apple Developer Documentation

 

developer.apple.com

UserDefaults

An interface to the user’s defaults database, where you store key-value pairs persistently across launches of your app.
유저디폴트, 사용자 기본값이라고 생각하면 된다. 키-값 형태로 저장되며 키는 문자열형태, 값은 스위프트의 기본자료형인 Float, Double, Int, Bool, URL 타입 이외에 NSData,NSString,NSNumber,NSDate,NSArray,,NSDictionary 자료형을 담아낼 수 있다고한다.
설명만 들었을때는 이걸 어떻게 사용하는건가 싶었는데, Zedd님의 글을 보고서 금방 이해했다. 앱의 최근 상태를 저장하거나 최근 값을 불러내기 위해 사용된다고 보면된다. 
 

iOS ) 왕초보를 위한 User Defaults사용해보기(switch)

안녕하세요 :) 오늘은 UserDefaults에 대해서 배워볼게요!!UserDefaults가 무엇이냐!! 간단하게 말해서 "데이터 저장소"라고 생각하시면 된답니다.UserDefaults를 사용하면 앱의 어느 곳에서나 데이터를 쉽

zeddios.tistory.com

저장

func set(Any?, forKey: String)
func set(Float, forKey: String)
func set(Double, forKey: String)
func set(Int, forKey: String)
func set(Bool, forKey: String)
func set(URL?, forKey: String)

매개변수의 자료형에 따라 set메소드를 사용해 키-값 형태로 저장이 된다.

불러오기

func object(forKey: String) -> Any?
func url(forKey: String) -> URL?
func array(forKey: String) -> [Any]?
func dictionary(forKey: String) -> [String : Any]?
func string(forKey: String) -> String?
func stringArray(forKey: String) -> [String]?
func data(forKey: String) -> Data?
func bool(forKey: String) -> Bool
func integer(forKey: String) -> Int
func float(forKey: String) -> Float
func double(forKey: String) -> Double
func dictionaryRepresentation() -> [String : Any]

이후 불러올 키와 함께 자료형에 맞는 함수에 적으면 된다. 


간단하게 NavigationView를 만들어서 확인해보았다. 좌측이 UserDefaults를 사용하지 않은 경우, 뷰가 생성될 때마다 초기값으로 시작하는 것을 볼 수 있는 반면, UserDefaults를 사용하게 되면 값들을 따로 저장하고 불러오는 것이 가능해진다. 저장된 자료들은 앱을 껐다 켜도 그대로 남아있는 모습을 볼 수 있었다.

NextView의 onAppear, onDisappear 구현을 통해 UserDefaults를 저장하고 불러오는 동작을 구현하였다.

import SwiftUI

struct ContentView: View {
    var body: some View {
        NavigationView {
            VStack{
                NavigationLink(destination: NextView(), label: {
                    Text("NextView!")
                })
            }.navigationTitle("Test")
        }
        .padding()
    }
}

struct NextView: View {
    @State private var toggleIsOn = false
    @State private var count = 0
    
    var body: some View {
        VStack{
            Toggle("Toggle switch", isOn: $toggleIsOn)
            HStack{
                Button("-", action: {
                    count -= 1
                })
                Text("\(count)")
                Button("+", action: {
                    count += 1
                })
            }.font(.system(size: 50))
        }
        .padding()
        .onAppear{
            count = UserDefaults.standard.integer(forKey: "countKey")
            toggleIsOn = UserDefaults.standard.bool(forKey: "toggleKey")
        }
        .onDisappear{
            UserDefaults.standard.set(count, forKey: "countKey")
            UserDefaults.standard.set(toggleIsOn, forKey: "toggleKey")
        }
    }
}

CoreData

https://developer.apple.com/documentation/coredata/

 

Apple Developer Documentation

 

developer.apple.com

 Core Data

Persist or cache data on a single device, or sync data to multiple devices with CloudKit.

UserDefaults의 경우는 간단한 유저 설정을 저장하는 데에 용이하지만, 더 복잡한 사용자 자료를 담아내려면 Coredata가 적합하다. 

coredata에는 많은 기능들이 있지만 대다수가 Persistence 기능을 위해 사용하는 것으로 알고 있다.

Persistence

Core Data abstracts the details of mapping your objects to a store, making it easy to save data from Swift and Objective-C without administering a database directly.

문서에 따르면 데이터베이스를 직접 사용하지 않고 swift, obj-c 자료들을 손쉽게 저장할 수 있다고 한다. zedd님의 설명을 읽어보니 대략적인 느낌은 알겠으나 아직 본인의 역량이 부족한지 완벽하게 이해가 되지 않는다. coredata 부분을 완벽하게 이해하기 위해서는 나중에 더 많은 시간을 들여 공부해야겠다.

 

Core Data (1)

안녕하세요 :) Zedd입니다. Core Data를 사용할 일이 생겼는데...제가 옜날에 해봤단 말이죠..!?!?!? 근데 다시 하려니까 생각이 하나도 안나는거에요 그때는 문서 볼 생각도 안했었는데..ㅎㅎㅎㅎ 이

zeddios.tistory.com

 

 

Core Data (2)

안녕하세요 :) Zedd입니다. https://zeddios.tistory.com/987 Core Data (1) 안녕하세요 :) Zedd입니다. Core Data를 사용할 일이 생겼는데...제가 옜날에 해봤단 말이죠..!?!?!? 근데 다시 하려니까 생각이 하나도 안

zeddios.tistory.com

 

https://www.acmicpc.net/problem/1916

 

1916번: 최소비용 구하기

첫째 줄에 도시의 개수 N(1 ≤ N ≤ 1,000)이 주어지고 둘째 줄에는 버스의 개수 M(1 ≤ M ≤ 100,000)이 주어진다. 그리고 셋째 줄부터 M+2줄까지 다음과 같은 버스의 정보가 주어진다. 먼저 처음에는 그

www.acmicpc.net

다익스트라 알고리즘을 통해 풀 수 있다.

 

풀이

출발 노선 지점에서 각 지점으로의 최소비용을 담을 dist:[Int]() 배열을 생성한다. 이후 입력되는 노선의 정보를 저장한 후 너비 우선 탐색을 통해 다음 노선까지의 비용이 더 저렴하다면 dist 원소 값을 경신한 후 값이 경신된 해당 지점을 큐에 담아 다음 탐색 경로에 추가해주면서 탐색을 수행하면 된다.

참고해야 할 점은 입력받은 노선 정보를 비용 기준 오름차순 정렬해주어야 한다는 점이다. 다익스트라 알고리즘의 조건인 최소비용부터 탐색한다는 조건을 생각하지 못해 정렬하지 않은 채로 제출했었는데 시간 초과가 일어났었다. 곰곰이 생각해보니 A -> B로 가는 노선이 여러 개일 경우 정렬을 하지 않은 채로 탐색을 수행한다면 큐에 중복된 경로를 추가하게 되어 불필요한 탐색을 수행하게 된다.

 

정답 코드

 

'Problem Solving > BOJ' 카테고리의 다른 글

[2096] 내려가기  (0) 2022.11.29
[3649] 로봇 프로젝트  (0) 2022.11.26
[1105] 팔  (0) 2022.11.24
[12015] 가장 긴 증가하는 부분 수열2  (0) 2022.11.23
[2166] 다각형의 면적  (0) 2022.11.22

https://developer.apple.com/library/archive/documentation/IDEs/Conceptual/iOS_Simulator_Guide/TestingontheiOSSimulator/TestingontheiOSSimulator.html

 

Testing and Debugging in Simulator

Retired Document Important: The information in this document is deprecated in Xcode 9. For Xcode 9 and later, see Simulator Help by choosing Help > Simulator Help in Simulator. Testing and Debugging in Simulator Simulator is a great tool for rapid prototyp

developer.apple.com

시뮬레이터에서 할 수 없는 동작들에 대해 생각해보았다. 시뮬레이터 관련 공식문서는 찾았지만 구버전의 xcode 시뮬레이터 관련 문서였고, 최근 버전의 레퍼런스 페이지에서는 시뮬레이터 관련 문서를 찾지 못했다. 일단 구버전 문서의 기준에 따르면 다음과 같은 동작들이 불가능하다.


Hardware Differences

Though most of the functionality of devices can be simulated in Simulator, some hardware features must be tested directly on a device. The hardware features that are not simulated as of iOS 8.2 are:

  • Motion support (accelerometer and gyroscope) are unsupported.
  • Audio and video input (camera and microphone) are unsupported.
  • Proximity sensor
  • Barometer
  • Ambient light sensor

API Differences

Simulator APIs don’t have all the features that are available on a device. For example, the APIs don’t offer:

  • Receiving and sending Apple push notifications
  • Privacy alerts for access to Photos, Contacts, Calendar, and Reminders
  • The UIBackgroundModes key
  • Handoff support

In addition, Simulator doesn’t support the following frameworks:

  • External Accessory
  • IOSurface
  • Media Player
  • Message UI
  • In UIKit, the UIVideoEditorController class

한 가지 의문인 점은 하드웨어에서의 오디오 입력 부분이다. 현시점 시뮬레이터 14.1 버전에서는 입출력 관련 메뉴가 따로 있다. 해당 메뉴를 통해 오디오 입력을 맥북의 마이크로 지정할 수 있고, 실제로 입력이 가능한지 텍스트 입력을 해보았다.

영어는 물론 한국어로도 잘 인식이 되는 모습을 확인할 수 있었다. 시뮬레이터가 오디오 입력을 지원하니 아마도 테스트용 앱 개발을 통해서도 입력을 지원하지 않을까 싶다. 나머지 가속도, 근접, 조도 센서와 같은 부분은 당연히 지원하지 않을 것으로 보인다. 기압계(barometer)도 적혀있는데, 아이폰에 운동량 측정을 위해 아이폰6부터 들어간 센서라고 한다. 해당 센서를 통해 개발자는 대략적인 고도를 알아낼 수 있다고 한다. 이런 부분은 처음 알았다.

이외에도 시뮬레이터의 메뉴들을 좀 더 찾아보니 페이스아이디 지원 부분도 있었다. 맥북에는 당연하게도 페이스 아이디 센서가 없으니 일치, 불일치와 같은 조건 상황만 지원하는 것으로 보인다. 

 

그리고 정보를 찾다가 많은 분들이 마우스로만 조작해야하므로 핀치 줌인/아웃 동작을 할 수 없다고 적어놨던데, 틀린 정보다. 옵션 키를 누르면 투 포인트로 제어할 수 있다. 해당 부분은 스탠퍼드 swift 강의로 유명한 cs193p 강의에서 확인했던 기능이다. 해당 부분은 본인도 지도 관련 앱을 개발할 당시 잘 사용했던 기능이다. 

option키를 누르고 있으면 x,y축 반전으로 동작하는 하나의 포인터가 추가되고, shift를 추가로 누르게 되면 평행이동하는 포인터로 제어가 가능하다.

이상 요약하자면 시뮬레이터로 할 수 없는 것들은 다음과 같다.

하드웨어

  • 가속도, 자이로스코프센서
  • 비디오 입력(카메라)
  • 근접센서
  • 기압 센서
  • 조도센서

API

  • 애플 푸시 알림
  • 사진, 연락처, 캘린더, 리마인더 등 개인 정보 접근
  • The UIBackgroundModes key
  • 핸드오프 기능

API 측면에는 적지 않은 더 많은 기능들이 적혀있는데 하나하나 확인하기에는 시간이 걸릴 것 같으므로 천천히 알아봐야겠다.

https://www.acmicpc.net/problem/1105

 

1105번: 팔

첫째 줄에 L과 R이 주어진다. L은 2,000,000,000보다 작거나 같은 자연수이고, R은 L보다 크거나 같고, 2,000,000,000보다 작거나 같은 자연수이다.

www.acmicpc.net

그리디 문제다. 숫자가 아닌 문자열로 접근해서 풀었다. 숫자로 접근하게 된다면 최대 범위가 0 ~ 2,000,000,000 이므로 분명 시간 초과가 일어날 것이다. 따라서 8이 나올 수 있는가에 대한 조건만 생각해서 접근해야 한다.

 

우선 자릿수의 변동이 일어나면 8이 나올 수 없다. 즉 L과 R의 자릿수를 먼저 체크해야 하고, 이후 자릿수가 같다면 어느 자리까지 제한하였는지를 확인해야 한다. 각 자릿수의 숫자가 같을 경우에만 8의 개수를 세고 각 자릿수가 달라지는 시점이 온다면 해당 숫자는 8이 아닌 수로 바꿀 수 있다는 뜻으로 접근하면 된다.

 

풀이

자릿수가 다르다면 8이 없는 구간이 생길 수밖에 없으니 0을 출력하면 된다.

자릿수가 같다면 가장 큰 자릿수부터 숫자를 비교하여 8의 개수를 세면 되는데, 서로의 숫자가 다르다면 더 이상 숫자를 셀 필요 없다.

 

정답 코드

'Problem Solving > BOJ' 카테고리의 다른 글

[3649] 로봇 프로젝트  (0) 2022.11.26
[1916] 최소비용 구하기  (0) 2022.11.25
[12015] 가장 긴 증가하는 부분 수열2  (0) 2022.11.23
[2166] 다각형의 면적  (0) 2022.11.22
[16236] 아기 상어  (0) 2022.11.21

+ Recent posts