Language/Swift

    Swift에서 정규식 사용하기

    Swift에서 정규식 사용하기

    서론 Swift 언어 자체에서는 정규식을 지원하지 않아서 별도의 클래스를 이용해야 합니다. NSPredicate는 콜렉션 안의 내용을 검색하거나 필터링하는 용도로 많이 사용되구요 NSRegularExpression가 유니코드 문자열에 적용되는 정규식을 표현하므로, NSRegularExpression를 사용한 정규식 표현들을 알아보도록 하겠습니다. NSRegularExpression의 정규식 메타 문자 * u으 = uhhhh \x{으} = \xhh 엔 = n 무늬 = pattern 정규식 연산자 *엔 = n 템플릿 일치 양식 * 엔 = n 플래그 옵션 * 패턴은 i , x, s, m, w 순 입니다. 통으로 변역기를 돌려서 표현이 좀 이상할수도 있습니다 ^^;; 표현식은 공식 문서 참고하시면 되겠습니다. ..

    [Swift] 고차함수 Map, Filter, Reduce

    [Swift] 고차함수 Map, Filter, Reduce

    기본적인 라이브러리를 공부하고 해야지 해야지 하다가 놓친게 있었는데 코딩테스트를 하다가 계속 반복해서 찾게 되어서 별도로 포스팅 해보았습니다. 0. 고차함수란? 다른 함수의 전달인자를 함수로 받거나, 함수실행의 결과를 함수로 반환하는 함수입니다. 1. Map 배열 원소의 변형에 매우 효과적입니다. var arr: [String] = ["Apple", "Banana", "Mango"] let lowwer = arr.map{ $0.lowwercased() } //lowwer = ["apple", "banana", "mango"] var chars: [Characters] = ["1", "2", "3", "4", "5"] let toInt = chars.map{ $0.isWholeNumber! } //toIn..

    [Swift] GCD로 경마 구현해보기

    [Swift] GCD로 경마 구현해보기

    제가 플젝으로 말 육성 및 경마 게임을 제작하고 있는데요, java에선 그렇게 많이 돌아다니는 경마게임 예제가 swift에서는 찾아보기 힘든거 같아 경주부분만 떼어서 공유를 해보려고 합니다. 많이 부족한 코드지만 도움되었으면 좋겠구요 지적이나 오류도 댓글로 남겨주신다면 성실히 답변 해드리겠습니다. Race 클래스 /** - arr : 참가한 말들의 배열 - rnak : 참가한 말들이 골인시 순서대로 추가되는 배열 - lenth : 경주 길이 */ class Race { var raceProgress: [Int] = [] var rank: [Int] = [] var lenth: Int /** - Parameters: - numOfHorse: 경주에 참여하는 말의 수 - lenth: 경주 길이 */ init..

    Swift GCD(Grand Central Dispatch) [5] - Group, WorkItem

    Swift GCD(Grand Central Dispatch) [5] - Group, WorkItem

    Dispatch WorkItem은 task를 캡슐화 시키는데 사용하며 Dispatch Group는 task 그룹을 모니터하는데 사용합니다. 사용도 어렵지 않고, 형식도 dispatch queue와 비슷해, 자세한 설명은 공식문서 링크로 대체하고 저는 제 플젝에 사용한 예제를 포스팅하겠습니다. Dispatch work group developer.apple.com/documentation/dispatch/dispatchgroup Apple Developer Documentation developer.apple.com Dispatch work item developer.apple.com/documentation/dispatch/dispatch_work_item?language=occ Apple Develop..

    Swift GCD(Grand Central Dispatch) [4] - RunLoop 실행과 종료

    Swift GCD(Grand Central Dispatch) [4] - RunLoop 실행과 종료

    developer.apple.com/documentation/foundation/runloop Apple Developer Documentation developer.apple.com developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Multithreading/AboutThreads/AboutThreads.html#//apple_ref/doc/uid/10000057i-CH6-SW2 About Threaded Programming About Threaded Programming For many years, maximum computer performance was limited largely by the speed of a single ..

    Swift GCD(Grand Central Dispatch) [3] - 예제 사용해보기

    Swift GCD(Grand Central Dispatch) [3] - 예제 사용해보기

    앞서서는 GCD의 Global Queue를 사용하는데 필요한 이론을 알아봤으니, 이제 사용해보겠습니다. globla-aync-noneQoS 예제 import Foundation func forLoop(_ workName: String){ var result = 0 for _ in 1...10{ result += 1 } print("[\(workName)] : \(result)") } var runLooop = RunLoop.current DispatchQueue.global().async { forLoop("global 1") } DispatchQueue.global().async { forLoop("global 2") } DispatchQueue.global().async { forLoop("globa..

    Swift GCD(Grand Central Dispatch) [2]  - DispatchQueue

    Swift GCD(Grand Central Dispatch) [2] - DispatchQueue

    이전글에 이어서, GCD에 대해 좀더 자세히 알아보도록 하겠습니다. DispatchQuere Dispatch Queue는 작업을 순차적으로 처리할지, 병렬로 처리할지를 고를 수 있습니다. 순서대로 작업을 처리하는 Serial Queue, 동시에 병렬을 수행하는 Concurrent Queue가 있습니다. 여기서, 직렬로 처리할꺼면 스레드를 왜 사용하나요? 라는 궁금증이 들 수도 있는데, 여기서 다루는 작업의 직렬성 병렬성은 큐 단위임을 명심하면 헷갈리지 않을 수 있다. 1.Serial Queue : MainQueue, CustomQueue MainQueue는 MainThread에서 처리됩니다. 예를들면 스마트폰의 UI제어가 있겠네요. 이게 또 android와 다른 점인데, android는 UI를 애초에 스..

    Swift GCD(Grand Central Dispatch) [1] - 멀티스레딩 기초

    Swift GCD(Grand Central Dispatch) [1] - 멀티스레딩 기초

    이번에 기초 이론도 어느정도 공부도 했겠다, 간단한 개인 플젝을 제작중입니다. java공부때도 멀티스레팅을 사용해본 바, 해당 기능을 넣으면서 공부한 내용을 정리해 보았습니다. 우선 GCD에 대해 공부하기 전, 알아둬야할 개념들이 있습니다. 프로세스란 하나의 프로그램이 메모리에서 실행되는 작업단위 입니다. 그리고 스레드는 프로세스의 작업흐름의 단위입니다. 멀티 스레딩이 된다는 것은, 한 프로세스가 여러 스레드를 사용하는 것이죠 :) 멀티 스레딩에 관련해서 몇가지 프로그래밍 방식이 있습니다. 1. 동시성 프로그래밍 아주 재밋는 친구입니다. 사실 하나의 cpu가 큐에 넣은 작업순서대로 처리합니다. 다만 CPU의 연산처리가 빨라 여러가지 작업이 한번에 되는것같아 보일 뿐 입니다 ㅎ. 2. 병렬성 프로그래밍 복..

    Swift 서브스크립트 (Subscripts)

    Swift 서브스크립트 (Subscripts)

    서브스크립트란 무엇일까요? 코드에서 뗄레야 뗄수없는 이 간편한 기능은 바로 colectionType[i] 으로 사용하는 [i] 이녀석입니다. 서브스크립트란 콜렉션, 리스트, 시퀀스등의 집합의 특정 개별요소에 접근할 수 있는 문법입니다. Array 타입엔 [index]로, Dictionary 타입엔 [key]등으로 접근할 수 있습니다. 따로 구현없이 사용할 수 있었던 이유는, 이미 해당 타입에 서브스크립트가 구현되어있기 때문입니다 ㅎ 구조 subscript(index: Int) -> Int { get { // 적절한 반환 값 } set(newValue) { // 적절한 set 액션 } } 이런 구조로 되어있는데, 서브스크립트는 읽고 쓰기 및 읽기전용만 가능하다는 점이 특징입니다. get, set을 별도로 ..

    Swift 제네릭 (Generic)

    Swift 제네릭 (Generic)

    제네릭을 사용해 인자의 타입만 다르고 수행하는 기능이 동일한 것을 하나의 함수로 만들 수 있습니다. 따라서, 재사용 가능한 함수와 타입의 코드를 작성하는것을 가능하게 해줍니다. 이를위해 타입을 파라미터화해서 컴파일시 구체적인 타입이 결정되도록 합니다. 두 매개변수 a, b를 넣으면 a =b, b = a로 만드는 메서드를 작성해 보겠습니다. func swapTwoValues (_ a: inout T, _ b: inout T){ let tempA = a a = b b = tempA print("\(a), \(b)") } 플레이스 홀더안에 는 구체적인 타입을 명시한게 아니라, 두 인자의 타입이 같다는것을 알려줍니다. 실행해 볼까요? var a = 10 var b = 59 swapTwoValues( &a, &b..

    Swift 프로토콜 지향 프로그래밍 (POP)

    Swift 프로토콜 지향 프로그래밍 (POP)

    애플은 15년에 WWDC에서 Swift는 프로토콜 지향언어라고 말했습니다. 이번 글에선 프로토콜과 익스텐션의 조합으로 프로토콜 지향 프로그래밍을 공부해 서술하도록 하겠습니다. 프로토콜 초기구현 프로토콜 초기구현이란 프로토콜의 요구사항을 익스텐션을 통해 구현하는 것 입니다. Extension은 기존 타입의 기능을 확장하고, Protocol은 프로토콜을 정의할 때 요구사항만을 정의할 뿐 구현은 불가능합니다. 이 두가지를 조합해, 익스텐션에서 프로토콜이 요구하는 기능을 구현해 줄 수 있습니다. 단, 저장 프로퍼티는 익스텐션에서 구현할수 없으므로, 각 타입에서 직접 구현해야합니다. 예제 메세지를 수신받는 Receiveable 포로토콜 입니다. machine과 name를 통해 수신받은 기기와 수신자를 저장합니다...

    Swift 접근제어

    Swift 접근제어

    접근제어란? 정보의 은닉화를 구현하기 위한 핵심 기능이 접근제어 입니다. 접근제어는 말그대로 접근을 제한할 수 있는 기능입니다. 이를통해 상세 구현은 숨기고, 허용된 기능만 사용하는 인터페이스를 제공할 수 있죠. 외부에서 보거나 접근하면 안되는 코드를 숨길 수 있고, 불필요한 접근으로 의도하지 않는 결과가 나올 수 있는 경우에 접근제어를 이용합니다. 스위프트의 접근제어는 모듈과 소스파일을 기반으로 설계됩니다. 모듈 모듈은 코드를 배포하는 단일 단위의 하나로, 프레임워크나 앱이 이 단위로 배포되고 import 키워드로 import할 수 있습니다. 소스파일 소스파일은 모듈안에 있는 소스파일을 의미합니다. 접근레벨 스위프트에서는 4개의 접근레벨을 제공합니다. 1. open & public 다른 모듈에서도 사용..

    Swift 고차함수

    Swift 고차함수

    고차함수란 다른 함수를 전달인자로 받거나, 함수실행의 결과로 함수를 반환하는 함수를 뜻합니다. 함수의 외부에서 실행 흐름을 변형할 수 있기 때문에 재활용성 및 재사용성을 높여 주는 편리한 함수라고 할 수 있겠습니다. 이중 대표적인 map, filter, reduce를 공부해보도록 하겠습니다. map 컬렉션 내부의 기존 데이터를 변형해 새로운 컬렉션을 생성합니다. fucn map(_ transform: (String) throws -> T) rethrows -> [T] 예제 let numArr: [Int] = [1, 2, 3, 4, 5] var squardArr: [Int] = [] var stringArr: [String] = [] for문 사용 for num in numArr{ squardArr.app..

    Swift 오류처리

    Swift 오류처리

    Swift에서는 런타임 에러가 발생한 경우에 처리를 위한 일급 클래스를 제공합니다. 처리를 위해 발생, 감지, 증식, 조작을 지원합니다. Error라는 프로토콜을 준수하는 타입의 값을 통해 표현되는데, 이 프로토콜은 사실상 요구사항이 없는 빈 프로토콜 입니다. 그래도 오류를 표현하기 위한 타입 (예를들면 열거형)은 이 프로토콜을 채택합니다. 다른언어의 exception처리와 비슷하지만, 다른점은 call stack과 unwinding과 관련이 없어 비교적 많은 계산이 필요하지 않다는 점입니다. 그래서 에러를 반환하는 throw구문은 일반적인 반환 구문인 return 구문과 비슷한 성능을 보여줍니다. 표현 enum KindfError: Error{ case error1 case error2 case err..

    Swift 익스텐션 (Extensions)

    Swift 익스텐션 (Extensions)

    익스텐션을 이용해 클래스, 구조체, 열거형, 프로토콜 등 모든 타입에 기능을 추가할 수 있습니다. 심지어 원본 코드를 몰라도 타입만 알고있다면 기능을 확장할 수 있습니다. 참고로, 기능은 추가가 가능해도 override는 불가합니다! 익스텐션을 이용해 가능한 기능들은 다음과 같습니다. 계산된 인스턴스/타입 프로퍼티의 추가 인스턴스/타입 메소드 추가 새로운 이니셜라이저 제공 서브스크립트 정의 중첩타입의 선언과 사용 특정 프로토콜을 따르는 다입 만들기 추가로, 익스텐션은 외부 라이브러리나 프레임워크에 대해도 사용할 수 있습니다. 특히, 프로토콜과 함께 사용한다면 굉장히 강력한! 기능이라고 하니 이는 나중에 또 공부해서 포스팅 해보도록 하겠습니다. 정의 extension TypeName { //구현부 } //..

    Swift 프로토콜 기초

    Swift 프로토콜 기초

    프로토콜은 특정 기능 수행에 필수적인 요소를 정의한 청사진입니다. 프로토콜을 만족시키는 타입을 '프로토콜을 따른다'고 표현할 수 있습니다. 또한 프로토콜은 필수 구현 및 기능 추가를 위해 확장이 가능힙니다. 프로토콜의 요구사항을 충족시키려면, 프로토콜이 제시하는 정사진의 기능을 모두 구현해야 합니다. 즉, 프로토콜은 기능을 정의하고 제시만 할 뿐 구현된 상태는 아닙니다. java의 interface와 굉장히 유사한데 몇가지 차이가 있습니다. 프로토콜은 초기값 지정이 불가능하고 static이 사용 가능하며 옵셔널로 선언된 멤버는 구현을 안해도 된다는 점이 차이입니다. 구현 protocol Weapon { var name: String { get, set } var type: String { get } va..

    Swift Assert와 Guard

    Swift Assert와 Guard

    이번엔 디버깅에 편리한 기능입니다. 애플리케이션 동작중 생성되는 연산 결과들을 동적으로 확인해 안전하고 빠르게 처리할 수 있습니다. Assertion assert(::file:line)함수를 사용합니다. 디버깅 모드에만 동작하구요, 조건검증에 사용합니다. var num1 : Int = 0 assertion(num1 == 0, "someInt !") var num2: Int = 1 assertion(num2 == 0, "num2 != 0") //assertion failed: num2 != 0 음.. 하루만 더 일찍 공부했었으면 어제 코테문제를 풀면서 좀 덜 고생했겠네요.ㅜ Guard guard를 사용해 특정 실행구문이 잘못된 값을 전달하면 빠르게 종료시킵니다. 디버깅모드 + 어떤 조건에서도 동작합니다. ..

    Swift 타입캐스팅 (형변환)

    Swift 타입캐스팅 (형변환)

    Swift의 타입캐스팅은 인스턴스의 타입을 확인거나 클래스의 인스턴스를 부모 또는 자식클래스의 타입으로 사용할 수있는지 확인하는 용도로 사용합니다. is 또는 as를 사용합니다. 그림으로 간단히 설명해보겠습니다. Person - Study - Programming 순으로 부모-자식클래스라고 생각해봅시다. Programming 클래스는 Psrson클래스의 자식 클래스인 Study의 자식클래스입니다. Person을 상속한 Study를 상속했으니, 당연히 Person의 모든 프로퍼티가 있습니다. 따라서 true입니다 반대로 Person은 Programming의 모든 프로퍼티를 갖고 있지 않아서 Person클래스는 Programming으로 사용이 불가능합니다. 반대로 Person은 Programming의 모든 ..

    Swift 인스턴스의 생성과 소멸

    Swift 인스턴스의 생성과 소멸

    프로퍼티 기본값 Swift에선 인스턴스는 초기화와 동시에 모든 프로퍼티에 유효한 값이 할당되어야 합니다. 미리 기본값을 할당하면 생성과 동시에 초기값을 지니게 됩니다. class Someone { var name = "미입력" var age = 0 func call() { print( "\(self.name)은 \(self.age)살 입니다." ) } } let greensky: Someone = Someone () greensky.call() //미입력은 0살 입니다. greensky.name = "Greensky" greensky.age = 20 greensky.call() //Greensky은 20살 입니다. 이니셜라이저 사용 기본값 지정이 불가능하거나 사용이 어려운 경우엔 이니셜라이저를 사용합니다..

    Swift 프로퍼티 타입들

    Swift 프로퍼티 타입들

    프로퍼티는 속성이라고도 불린다. 객체의 일부로, 이름과 값 사이의 연결을 의미힌다. 즉, 프로퍼티는 객체를 구성하는 블록(내부의 속성)들이다. 프로퍼티의 종류는 5가지로 나눌 수 있다. 인스턴스 저장 프로퍼티 타입 저장 프로퍼티 인스턴스 연산 프로퍼티 타입 연산 프로퍼티 지연 저장 프로퍼티 저장 프로퍼티 저장 프로퍼티는 단순히 값을 저장하고 있는 프로퍼티 입니다. let 키워드로 불변, var 키워드로 가변 프로퍼티를 만들 수 있습니다. struct Coordinate{ //불변 프로퍼티로 선언 후 변경 불가 let x: Int //가변 프로퍼티로 값 변경이 자유로움 var t: Int } var pointA = Coordinate(x: 0, y: 4) pointA.x = 2 //error 불변 프로퍼티..