라벨이 Swift인 게시물 표시

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...

[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]과 같이 일반 배열을 사용하듯이 사용할 수 있고, 하위 메서드들 또한 같이 ...

navigationController Backbutton 수정하

이미지
navigationController Backbutton 수정하 navigation Controller BackButton 수정하기 navigationController에서 navigation bar의 < Title 을 수정하고 싶을 때가 있다. 구글링을 해보면 let backItem = UIBarButtonItem() backItem.title =` `"Back" navigationItem.backBarButtonItem = backItem navigationItem.backButton?.title = "" 등등 여러 방법들이 나오지만 . . . . ~~무슨짓을 해도 수정되지 않는다. ~~ 왜냐하면 navigation controller에서 backbutton은 현재 컨트롤러가 아니라 이전 컨트롤러기 때문에 segue를 전달하기 전에 수정을 해줘야 한다!! 따라서 prepare에서 backBarButtonItem 을 수정해주면 된다!!! override func prepare(for segue: UIStoryboardSegue, sender: Any?) { let nxetVC = segue.destination let backItem = UIBarButtonItem() backItem.title = "nextBackTitle!!!" navigationItem.backBarButtonItem = backItem }

Timestamp 시간 변환하

Timestamp 시간 변환하 Timestamp를 사용해 시간 포멧을 변경해보자. 간단하다. 바로 코드부터 보자. func timeFormatter(timestamp: TimeInterval) -> String? { let dateFormatter = DateFormatter() dateFormatter.locale = Locale(identifier: "ko_KR") dateFormatter.dateFormat = "yyyy.MM.dd HH:mm" let date = Date(timeIntervalSince1970: timestamp) return dateFormatter.string(from: date) } timestamp는 1970년도를 기준으로 한 경과시간을 나타낸다. 이를 변환해주는 ==DateFormatter()==를 생성하고 DateFormatter에 원하는 형식을 입력해주면 된다. 우선 지역을 입력한다. (한국 기준 “ko_KR”) 그리고 원하는 날짜 포멧 형태를 입력한다. (예제는 연도,월,일 시:분:초) 그리고 timestamp를 Date형식으로 변환시켜주면 된다.

URL Loading System 이란??

이미지
URL Loading System 이란?? URL Loading System 서버와 통신하려고 할 때 URLSeession API를 사용한다. 하지만 공식문서에서는 이를 사용하기 전에 URL Loading System에 대해 먼저 보고 올 것을 권장한다. URL Loading System URL Loading System은 https나 직접만든 표준 프로토콜을 사용해 URLs로 식별되는 자료에 접근할 수 있도록 해준다. Loading은 비동기적으로 처리되기 때문에 앱이 응답속도를 유지하면서 데이터나 오류를 처리할 수 있다. URLSession instance는 하나 또는 다수의 URLSessionTask instance를 가질 수 있는데, URLSessionTask instance는 앱에 대한 데이터, 다운로드 파일 또는 업로드 데이터나 remote의 파일등을 가져오고 리턴할 수 있다. Session을 관리하기 위해서 URLSessionConfiguration object를 사용해 캐시나 쿠키등을 컨트롤 할 수 있고 네트워크와 연결을 관리할 수 있다. 하나의 Session을 반복적으로 사용해 task를 만들 수 있다. 예를들어, 하나의 웹브라우저는 여러개의 분리된 세션들을 가질 수 있다. Session Session은 크게 3가지가 있다. Deafult: 기본적인 디스크 기반의 Default session Ephemeral: 어떠한 데이터도 저장하지 않는 Ephemeral Session Background: 앱이 종료된 이후에도 통신이 이뤄지는 Background Session

[Swift Error] Outlets cannot be connected to repeating content.

이미지
[Swift Error] Outlets cannot be connected to repeating content. Swift Error: Outlet from the TableViewController to the UILabel is invalid. Outlets cannot be connected to repeating content. 주로 CustomCell을 만들때 발생하는 에러이다. 해당 아울렛을 TableViewController에 연결시킬 수 없다는 에러인데, CustomCell의 클래스를 다음과 같이 CustomCell 클래스를 새롭게 정의하고 그 클래스에 연결시켜주어야 한다. class CustomCell:UITableViewCell { 여기에 connect!! } 다음과 CityStateCell이라는 클래스를 정의했다면, Main.storyboard에 연결시키는것도 잊지말도록 하자.

CGV 상영시간표 알리

이미지
CGV 상영시간표 알리 CGV 상영시간표 알리미 를 만들어보자! 나만의 내가 나를위해 기록하는 개발일지 삽질일지 언제 오픈될지 모르는 CGV의 상영시간표! 언제 열리나 전전긍긍하며 수시로 들락날락… 그만합시다! 무엇이 필요할까 영화관 데이터 가져오기 상영정보 크롤링 자동화 크롤러 크롤링 서버 ios 앱 상영정보 크롤링 11월 21일 우선 정보를 가져올 수 있어야 시작이 가능하겠지? … 태어나 처음해보는 크롤링 … 웹 크롤링에 대해 검색하니 BeautifulSoup 를 사용해 정보를 가져올 수 있겠다! BeautifulSoup html 코드를 Python이 이해하는 객체 구조로 변환해주는 Parser! 네이버 인기검색어 크롤링 import requests from bs4 import BeautifulSoup html = requests.get('https://naver.com/').text soup = BeautifulSoup(html, 'html.parser') title_list = soup.select('.PM_CL_realtimeKeyword_rolling span[class*=ah_k]') for idx, title in enumerate(title_list, 1): print(idx, title.text) CSS Selector를 사용해 정보를 가져왔다. .PM은 PM이라는 글자가 들어가는 .PM li 는 PM class 밑에 속해 있는 li .PM > li 는 PM class의 직계 li 웹 구조는 변할 수 있으니 범위를 너무 구체적으로 잡지 않도록 주의한다! 생각보다 할만한데…? 야심차게 cgv 홈페이지도 마찬가지 방법으로 시도! 하지만 정보가 나오지 않는다… 왜지? BeautifulSoup를 사용한 크롤링은 검사에서 나오는 html에서가 아니라 페이지...

Xcode 꿀 Tip

Xcode 꿀 Tip Xcode 꿀팁 모음 시뮬레이터 실행 : cmd + R 좌측 네비게이션 열기 : cmd + 0 우측 네비게이션 열기 : cmd + option + 0 디버거 창 : cmd + shift + Y 마크업 : // MARK: ### ( 마크생성, 앞에 -을 추가하면 줄생김 ) 코드 자동 줄맞춤 : ctrl + I

Swift 자료구조 - Protocol

Swift 자료구조 - Protocol Protocol 공부하면서 익힌 내용을 정리하고 있습니다. 아직 부족한 부분이나 잘못된 부분이 있을 수 있으니, 있다면 댓글로 피드백 부탁드립니다. 스탠포드의 CS193p 강의를 참고해 작성하였습니다. Swift 자료구조의 4가지 기둥 중 하나인 Protocol을 알아보자. swift 실행 시 굉장히 많이 사용되기 때문에 중요하다. Protocol이란 API에서 원하는 것을 불러오는 방식이다. 어떤 구조체든 열거형이든 클래스든 원하는 모든 것을 불러오고 어떤 것이든 전달할 수 있다. 그걸 받는 메소드는 원하는 것이 무엇인지 나타낼 수 있다. 즉, 호출자와 피호출자 양쪽 모두를 만족시키는 것이다. 이는 프로토콜이 변수와 함수의 리스트이기 때문이다. 프로토콜은 어떤 구현이 아니라 단순한 리스트다. 프로토콜은 왜 좋을까? 프로토콜은 API를 매우 유연하고 더 잘 이해할 수 있도록 만든다. MVC와 같은 블라인드 커뮤니케이션 구조에 매우 효과적이다.

Swift 문자열 String

Swift 문자열 String String 공부하면서 익힌 내용을 정리하고 있습니다. 아직 부족한 부분이나 잘못된 부분이 있을 수 있으니, 있다면 댓글로 피드백 부탁드립니다. 스탠포드의 CS193p 강의를 참고해 작성하였습니다. string은 unicode로 구성되어 있다. 유니코드는 전세계 모든 언어를 나타낼 수 있는데, 바이트 단위로 데이터를 나타낸다. ‘cafe’라는 글자가 있을 때, 강세가 있냐 없냐에 따라서 4개의 유니코드 (c-a-f-e) or 5개의 유니코드 (c-a-f-e-’)로 나타내질 수 있다. 따라서 이러한 차이로 인해 string은 Int 로 색인되지 않는다. 유니코드는 대신 string.index를 사용한다. 예를 들어보자, let pizzaJoint = "cafe(`) pesto" let firstCharacterIndex = pizzaJoint.startIndex // String.index 타입이다. let fourCharacterIndex = pizzaJoint.index(firstCharacterIndex, offsetBy: 3) let forCharacter = pizzaJoint[fourCharacterIndex] // e(') // "pesto" 를 얻어보자. if let firstSpace = pizzaJoint.index(of: " ") { // space가 없을 수도 있어서 if let을 사용 let secondWordIndex = pizzaJoint.index(firstSpace, offsetBy: 1) // 두 번째 문장은 공백 바로 뒤 첫번째에서 시작! let secondWord = pizzaJoint[secondWordIndex..<pizzaJoint.endIndex] // 두 번째문장 처음부터 문장 끝까지! } // "pesto"를 얻는 다른방법 // 단, 여...

Swift 4.2 Document

Swift 4.2 Document Swift document C와 Java와 같은 다른 언어에 익숙한 나같은 사람에게 스위프트는 굉장히 생소하게 느껴질 수 있다. 도대체 왜 이 모양인지 왜 이렇게 만들었는지는 doc를 참고하는게 제일 빠른법. Stanford CS193P 강의를 참조해 필수적으로 알아야 하는 부분들을 정리해보자. LANGUAGE GUIDE The Basic Type Safety and Type Inference 스위프트는 type-safe 언어이다. type-safe언어는 가능한 타입을 명확하게 명시해야 한다. 스위프트가 type safe인 이유는 타입체크를 위해서이다. 이는 에러를 막도록 돕는다. 하지만 type safe라는 뜻이 항상 명시적으로 타입을 선언해야 한다는 뜻은 아니다. 스위프트는 타입 추론이 가능하다. 한마디로 명시하지 않아도 컴파일러가 무슨 타입인지 추정해서 타입을 정한다는 뜻이다. 예를들어, let meaningOfLife = 42 // 소수점이 없는 숫자는 Int 타입으로 추정된다. let pi = 3.14159 // 소수점이 있는 숫자는 Double 타입으로 추정된다. let anotherPi = 3 + 0.14159 // Int와 Double의 합은 Doublef로 추정된다. Numeric Type Conversion 음수로 생각되더라도 Int type을 사용해라. Int type은 상황에따라 상수 또는 변수로 적용될 수 있다. 특별히 필요한 경우에만 다른 integer type을 사용해야 하는데, 외부소스에서 명시적으로 크기가 정해진 데이터나, 성능, 메모리 사용이나 기타 필요한 최적화를 위해 필요할 때만 사용한다. 이럴 때 명시적으로 크기가 지정된 타입을 사용하면 우발적인 오버플로우를 잡아내고 데이터의 특성을 암시적으로 문서화 할 수 있다. Optionals 값이 존재하지 않을 수도 있을 때 optionals을 사용한다. opti...