Swift-designPattern-Singleton

Swift-designPattern-Singleton Singleton 패턴 많은 프로젝트에서 사용되는 싱글톤 패턴에 대해 알아보자. 싱글톤 패턴은 특정 클래스에 대해서 객체가 하나만 생성되도록 보장하는 방법이다. 특정 클래스의 값을 여러 클래스에서 공유해야 한다거나, 하나씩 순서대로 처리할 때 주로 사용된다. 사용자 설정값은 여러 객체에서 각각의 값을 저장하기 보다는 앱 전체에서 하나의 값으로 관리되어야 한다. 싱글톤 패턴 작성 방법에 대해 알아보자. class Singleton { static let sharedInstance = Singleton() fileprivate init() { } } 싱글톤 패턴은 말그대로 매우 씸플하다. 어느 곳에서든 하나의 값만 존재하는 static 정적 객체를 하나 생성하고 그곳에 클래스 생성을 선언한다. // 일반적인 형태 let a = ClassName() a.normalVar a.normallet a.normalFunction() // 정적 요소 사용시 ClassName.staticVar ClassName.staticLet ClassName.staticfuntion() 좀 더 구체적인 예시를 살펴보자. class Singleton { static let sharedInstance = Singleton() let height: Int let weight: Int private init() { self.height = 100 self.weight = 200 } } 다음과 같은 클래스가 있다면 사용법은 매우 간단하다. // singleton 상수에 Singleton 클래스의 객체를 대입한다. let singleton = Singleton.sharedInstance print("\(singleton.height), \(singleton.weight)") // 100, 200 싱글톤 패턴의 좋은 점은 현재의 객체를 보고 ...

Swift-LifeCycle

Swift-LifeCycle [Swift] LifeCycle viewDidLoad 일반적으로 초기화 하기에 가장 좋은 메서드. 모든 것이 준비되어있고 outlet도 연결돼서 바로 시작이 가능하다. 단 한번만 호출된다. 하지만 아직 경계(bounds)가 설정되지 않았기 때문에 기하와 관련된 설정은 하지 말아야 한다. –> viewWillLayoutSubViews(), viewDIdLayoutSubViews() 에서 관리 override func viewDidLoad() { super.viewDidLoad() } viewWillAppear 곧 뷰 컨트롤러의 뷰가 화면에 나타날 것. 화면에 보이지 않던 시간동안 발생한 일을 관리. 주로 최신작업을 해준다. 여러번 호출 가능 override func viewWillAppear() { super.viewWillAppear() } viewDidAppear 뷰가 화면에 나타난 이후에 호출된다. 애니메이션 같은 작업을 하기에 좋다. 네트워크 작업과 같이 비용이 큰 작업을 하기에 적합하다. 이러한 네트워크 작업은 보통 백그라운드에서 실행한다. 절대 사용자 작업을 방해해서는 안된다. override func viewDidAppear() { super.viewDidAppear() } viewWillDisappear viewWillAppear에서 했던 작업을 그대로 되돌리기 적합하다. 타이머를 시작했거나, 애니메이션을 시작했거나, GPS관찰을 시작했을 때 되돌리기 좋다. override func viewWillDisappear() { super.viewWillDisappear() } viewDidDisappear MVC를 정리하기 좋다. 자주 쓰이지는 않는다. override func viewDidDisappear() { super.viewDidDisappear() } viewWillLayoutSubViews(), viewDIdLayoutS...

Swift-High-Order-function-map-reduce-filter

Swift-High-Order-function-map-reduce-filter 고차함수 ( High Order function) 고차함수란? 하나 이상의 함수를 인자로 취하는 함수 함수를 결과로 반환하는 함수 Swift에서 대표적인 예로는 map, reduce, filter 등이 있다. map 콜렉션 내부의 기존 데이터를 변형하여 새로운 콜렉션 생성 다시말해 array, dictionary 등의 요소들을 함수에 넣어서 요소마다 적용시켜준다. container.map(f(x)) // 컨테이너의 map 메서드 호출 -> return f( 컨테이너의 각 요소 ) // 새로운 컨테이너 각 원소들을 2씩 곱해주는 예를 들어보자. let num: [Int] = [0, 1, 2, 3, 4] var doubleNums: [Int] = [Int]() // for 문 이용 for n in num { doubleNums.append(n * 2) } print(doubleNums) // [0, 2, 4, 6, 8] // map 이용 doubleNums = num.map({ (number: Int) -> Int in return number * 2 }) print(doubleNums) // [0, 2, 4, 6, 8] // map 클로저 축약 doubleNums = num.map { $0 * 2 } print(doubleNums) // [0, 2, 4, 6, 8] filter container 내부의 값을 걸러서 추출 마찬가지로 예를 통해 살펴보자. let num: [Int] = [0, 1, 2, 3, 4] var evenNums: [Int] = [Int]() // for 문 이용 for n in num { if n % 2 != 0 { continue } evenNums.append(n) } print(doubleNums) // [0, 2, 4] // filter 사용 evenNums...

Test1

Test1 블로그 테스팅 Written with StackEdit .

Test

Test Swift Test! Written with StackEdit .

vim 필수 명령어 정

vim 필수 명령어 정 Vim 필수 명령어 vim 명령어를 이번 기회에 공부할 때마다 정리해보자. Directory 강제 삭제 m -rf [디렉토리] -r은 파일 하위디렉토리까지 모두 삭제 -f는 강제삭제 파일 혹은 디렉토리 이동 mp [옵션] [이동시키려는 파일경로] [이동시킬 위치] -b : 이동 시킬 곳에 이미 파일 혹은 디렉토리가 있다면 옮기기전에 백업하고 이동. -f : 이동 시킬 곳에 이미 파일 혹은 디렉토리가 있다면 묻지도 따지지도 말고 그냥 강제 이동. -i : 이동 시킬 곳에 이미 파일 혹은 디렉토리가 있다면 일단 묻는다. -v : 이동시키는 과정을 보여준다. 경로는 상대경로와 절대경로를 모두 인식한다. 파일 혹은 디렉토리 복사 cp [옵션] file1 file2 cp file1 file2 file3 ... directory // 여러 파일 한번에 복사가능 -a, --archive : 파일 및 디렉토리뿐만 아니라 소유자 및 권한 정보 등 속성도 복사 (반면, 일반적으로는 복사하는 사용자의 기본적인 속성을 복사) -i, --interactive : 기존 파일을 덮어쓰기 전에 확인 메시지를 보여주는 옵션 (이 옵션 없이 cp를 사용하면 확인 과정 없이 그냥 파일을 덮어 씀) -r, --recursive : 디렉토리와 그 안의 내용까지 복사할때 사용 이옵션(또는 -a 옵션)은 디렉토리를 복사할 때 필요 -u, --update : 어떤 디렉토리에 있는 파일을 다른 디렉토리로 복사할 때 그 디렉토리에는 없거나 최신 버전인 파일만 복사하기 위해서 사용 -v, --verbose : 복사가 완료되었다는 메시지를 볼 수 있음

[Swift]_Input

이미지
Swift Input Swift에서 Input을 받는 방법 Swift를 iOS개발로만 배우다보니 언어를 배울때 기본중의 기본은 입출력 조차 잘 모르고 있었다… input…? textfield…?? 어떻게 하는거지…?! Swift에서는 readLine() 을 통해서 입력을 받을 수 있다. print("Please your favorite language.") let language = readLine() print("My favorite Language is \(language)") 다음과 같이 사용할 수 있다. readLine() 은 Optional String 을 리턴한다. 공백이 있는 문자열 입력 받기. 흔한 입력중에 공백을 갖고있는 문자열을 입력받을 때가 있다. 2가지 방법에 대해 알아보겠다. Foundation framework에서 제공하는 components(separatedBy: " ") 메소드를 사용하는 것이다. import Foundation if let input = readLine() { let a = input.components(separatedBy: " ") } String 자체의 split(separator: " ") 을 사용하는 것이다. if let input = readLine() { let a = input.split(separator: " ") } 둘에는 약간의 차이점이 있다. 우선 보시다시피 1번의 경우 반드시 Foundation을 import 시켜줘야 한다. PS를 할 경우 속도에 꽤나 영향을 미친다. 또 1번의 경우 [String], 2번은 [String.SubSequence]를 리턴한다. 하지만 이를 사용하는 방법은 별 차이가 없다. 똑같이 a[0], a[1]과 같이 일반 배열을 사용하듯이 사용할 수 있고, 하위 메서드들 또한 같이 ...