Programer/iOS 41

[Swift] StoryBoard 로컬라이즈(지역화) 쉽게하기

0. 들어가기 전에.. 기본적인 로컬라이즈(지역화) 방법은 아래 블로그를 참고하시면 쉽게 설정할 수 있습니다. http://trend21c.tistory.com/1689 1. 스토리보드 로컬라이즈스토리보드 로컬라이즈를 할 때, 일일히 Outlet를 바꿔줘야 하는 이슈가 있습니다. 저같은 경우는 스토리보드나 Nib 를 많이 사용하므로 로컬라이즈 할 때 꽤나 난감했습니다. 스토리보드에 있는 Outlet을 코드로 연결해줄수 없을까 했는데 다음과 같은 방법을 사용했습니다. protocol StroyBoardLocalizable { var LocalizerKey: String? { get set }} 일단, Label, Button, TextField 등 아웃렛에 사용할 프로토콜을 선언해주고.. extension..

Programer/iOS 2018.08.24

[FP] Imperative -> Declarative 예제를 통해 바꿔보기 (FizzBuzz)

예전 포스팅 중 Imperative -> Declarative 예제를 좀 더 진행해보려고 합니다.아래는 전에 보여드렸던 Imperative vs Declarative 예제입니다. let fizz: (Int) -> String = { i in i % 3 == 0 ? "fizz" : "" }let buzz: (Int) -> String = { i in i % 5 == 0 ? "buzz" : ""}let fizzbuzz = { i in { $0.isEmpty ? "\(i)": $0}(fizz(i) + buzz(i)) }let output = { print($0) } (1...100).map(fizzbuzz).forEach(output) 1. fizz(i) + buzz(i) 부분을 개선하고자 아래와 같이 + 함..

Programer/iOS 2018.07.16

[FP] 함수 & 고차함수 vs 클로저

1. 함수는 무엇인가요?기본적으로 Input 값이 있고 연산 후 Output이 있는 것을 함수라고 합니다. //두개의 Input값을 받아 더한 값을 Output값을 리턴 하는 함수 func addNumber(n1: Int, n2: Int) -> Int { return n1 + n2 } 추가로, Output 값만 있는 함수는 Generator, Input 값만 있는 함수는 Consumer 라고 부릅니다. 2. 고차함수는 무엇인가요?다른 함수를 전달인자로 받거나 함수 실행 결과를 함수로 리턴하는 함수를 고차함수라고 합니다. //실행 결과를 inc 함수로 리턴하는 makeInc 고차함수 func makeInc(_ n: Int) -> (Int) -> Int { func inc(_ x: Int) -> Int { ..

Programer/iOS 2018.07.12

[FP] Functional Programing 용어 정리

1. Immutable Datalet foo = "bar"한번 데이터를 넣으면 그 데이터를 바꾸지 마라.(= 새로운 데이터를 사용하고 싶으면 새로 선언해서 사용해라) 2. Pure Function함수 밖에 있는 변수를 바꾸지 말고, 안에서 변수를 만들어서 사용해라.(같은 Input 에서 같은 Output을 내보내는 것) 3. Fuction as First-Class CitizenFunction을 일급 객체로 사용해라 (Swift에서 지원) 4. Lazy Evaluationfunc heavyJob() -> String { return "This is heavy job" } func Log(_ mesage: String) {#if DEBUGprint(message)#endif}func Log(_ mesage..

Programer/iOS 2018.07.10

[Swift] Class와 Struct 무엇을 써야 할까요? (Class VS Struct)

서론: 데이터는 Class로 설계하는 것이 정석인가?- 저는 예전에는 JAVA를 즐겨 사용했기 때문에 OOP에 익숙해져있었습니다. - Swift로 개발을 할 때에도 대부분 Class를 사용해서 구현을 했습니다. 데이터를 설계할 때 정석처럼 느껴져왔기 때문이죠. (상속을 통한 모듈화)- 하지만 최근 Class보다 Struct를 더 사용해야한다는 것을 알게 되었고, 더 나아가 Functional Programing(FP), Reactive까지 알게되었습니다. 본론: 그럼 Class 와 Struct 는 뭐가 다를까?- Struct는 Class 보다 비교적 작고 비교가능합니다. ( = Value Type 입니다.)이러한 특징은 여러 참조가 같은 인스턴스를 가르키고 있는 Class보다 더 안전합니다.특히, Str..

Programer/iOS 2018.07.05

[Tip] iOS 세미나, 밋업 정보

Let us:Go!꽤 오래전부터 있었던 오픈채팅방 모임입니다. 초급/중급/고급 상관없이 자신이 알고 있는 것을 나누는 모임입니다.2017 봄 세션 : https://iosdevkor.github.io/let_us_go_2017_spring_review/2017 여름 세션 : https://iosdevkor.github.io/let_us_go_2017_summer_review/2017 가을 세션 : https://iosdevkor.github.io/let_us_go_2017_fall_review/2018 봄 세션 : https://iosdevkor.github.io/let_us_go_2018_spring_review/ letswiftSwift 컨퍼런스입니다. 주로 신림에서 개최되고 있습니다.2016 : h..

Programer/iOS 2018.06.04

[Tip] Apple MDM / 엔터프라이즈 계정 관련

Apple MDM (Mobile Device Management) MDM은 기업, 교육 기관 등의 단체에서 앱을 배포하고 모바일 기기들을 관리하기 위한 솔루션입니다. 개발자 계정은 엔터프라이즈 계정(379,000원 / 1년)을 보유 하여야 하며 MDM Vendor 인증서 발급 작업이 필요합니다. iOS의 경우 MDM 서버 구축 -> MDM 서버 정보를 포함한 Profile을 생성 -> 사용자가 Profile 설치(Device Management 허용) -> MDM 서버에 기기 등록의 과정이 선행되어야 합니다. 그 후, MDM 서버에서 MDM 커맨드를 iOS에 푸쉬를 하고 iOS가 MDM 서버와 연결되어 정의된 기능들을 수행합니다. 제어가능한 부분 프로파일 및 프로비전 제어 기능 디바이스 종료, 재시작, ..

Programer/iOS 2018.02.05

[Tip] iOS 기기 고유 식별 값을 사용하고 싶을 때 (UUID, App Groups)

iOS 기기 고유 식별 값을 알고 싶을 때, 대부분 UUID를 이용하여 사용합니다. 하지만 UUID의 경우, 앱을 재설치하면 변경되므로 문제가 발생합니다. 그때 쓸만한 라이브러리가 TAKUUID입니다. https://github.com/taka0125/TAKUUID 키 체인을 이용해서 앱 삭제후 재설치 해도 초기 설정 되었던 UUID 값을 사용 할 수 있습니다. (자세한 것은 Read Me 참고) 하지만 만약 같은 API를 사용하는 경우, 예를 들면 앱A와 앱B가 있는데 A, B가 같은 로그인 API를 사용한다면 A, B 의 UUID 가 서로 다르므로 문제가 생길 수 있습니다. 이 문제를 해결할 여러가지 방법이 있겠지만 저는 App Groups 로 해결 했습니다. 만약 그룹안에 앱이 있다면 거기서 사용한..

Programer/iOS 2017.11.06

[Swift] 클로저 (Closure)

1. 클로저란?특정 기능을 담은 코드를 블럭으로 모아둔 것(Swift는 함수를 일급변수로 취급하므로 클로저 역시 매개변수로 활용이 가능) 1. 클로저의 3가지 모양 - 이름을 가지면서 어떤 값도 획득하지 않은 전역 함수의 형태- 이름을 가진면서 다른 함수 내부의 값을 획득할 수 있는 중첩된 함수의 형태- 이름이 없고 주변 문맥에 따라 값을 획득할 수 있는 축약 문법으로 작성된 형태 2. 기본 클로저 - 클로저를 사용하지 않는 경우 sorted 매서드 사용let names = ["scott", "azsha", "john"] func backwards(first: String, second: String) -> Bool { return first > second } let reversed: [String] ..

Programer/iOS 2017.02.28