SWIFT

    [Swift] 연산자 메서드와 사용자 정의 연산자

    연산자 메서드 struct Vector2D{ var x = 0.0 var y = 0.0 } let vector1 = Vector2D(x: 3.0, y: 1.0) let vector2 = Vector2D(x: 1.0, y: 0.5) extension Vector2D{ // static(타입)메서드인 이유는 서로 다른 인스턴스를 더하기 때문에 타입 메서드이다. // 중위연산자⭐️(infix)는 생략이 가능하다 static func + (lhs: Vector2D, rhs: Vector2D) -> Vector2D{ return Vector2D(x: lhs.x + rhs.x, y: lhs.y + rhs.y) } // let plusVector = vector1 + vector2 static func - (lhs..

    [Swift] 비트연산자

    비트연산 메모리 비트단위로 직접적인 논리연산을 수행하고, 비트 단위 이동시에 사용하는 연산 비트연산은 연산속도가 빠르다. 직접적으로 메모리의 실제 비트를 컨트롤하기 때문이다. 짧은 코드로 복잡한 로직을 구현할 수 있다. 비트 논리 연산자 [ ~ ] Bitwise Not Operator ~a 부정 연산자, 기존의 메모리 비트를 반전시킨다. let a: UInt8 = 0b0000_1111 // 15 let b1 = ~a // 0b1111_0000 // 240 [ & ] Bitwise And Operator a & b 비트 논리 곱 연산자. let a: UInt8 = 0b0111_1000 // 120 let b: UInt8 = 0b1011_0111 // 183 let c = a & b//0b0011_0000 ..

    [Swift] 단락평가와 사이드이펙트

    단락평가 논리평가식에서 결과 도출에 필요한 최소한의 논리식만 평가한다. true || true // 왼쪽부터 평가하는데, ||(or)로 연결되어있기 때문에 뒤의 표현식이 true or false 에 상관없이 항상 true가 되기 때문에 뒤의 표현식은 검사하지 않는다. false && true // 이도 마찬가지로 &&(and)로 연결되어있기 때문에 뒤의 표현식인 true는 평가하지 않는다. 사이드이펙트 사이드 이펙트의 사전적인 의미는 '원래 의 목적과 다른 효과 또는 부작용'이라는 상태를 말한다. 마치 고혈압 약을 먹었는데 머리가 풍성해지는것과 같은..? 꼭 부정적인일만은 아니다. 하지만 좋은 결과를 나타낸다고해서 좋은 사이드 이펙트는 없다. var some = 0 func checking() -> Bo..

    객체간의 인터페이스를 추상화한다?(Swift)

    무슨소린지 못알아듣겠어서 공부하고 정리. 인터페이스 Swift에서 인터페이스는 Protocol이다. JAVA에는 인터페이스가 존재하는데, Swift의 Protocol과 비슷한 기능을 한다. 자바의 인터페이스와 프로토콜은 비슷하지만 차이가 있다. 기본값을 설정한다 ? 자바의 인터페이스는 기본값을 설정할 수 있다고 한다. Swift의 Protocol은 기본값을 설정할 수 없다. 요구사항의 구현정도? 자바의 인터페이스는 요구한 구현을 모두 정의해야한다. Swift의 Protocol은 optional로 선택 구현이 가능하다. 객체간의 인터페이스 추상화 객체간의 인터페이스를 추상화한다는 것은, 객체간의 상호작용에서 필요한 기능들을 분리하고 명확하게 정의한다는 것이다. 예를 들어, 학생 정보를 저장하고 관리하는 프..

    [Swift] - 프로토콜의 연관타입(associatedtype)과 제네릭

    제네릭은 특히 프로토콜에서 빛을낸다. 프로토콜에 제네릭이 적용되면 다형성을 구현하는데 큰 도움이 된다. 특정 프로토콜이 서로 다른 타입에 더욱 자유롭게 채택할 수 있도록 하여 통일성을 높이고, 재활용성도 함께 높아진다. 하지만 프로토콜 자체가 제네릭 파라미터를 가질 순 없다. 프로토콜은 메서드나 속성을 구체화할 의무가 없고 최소 요구사항만을 갖기 때문이다. 프로토콜에서 타입이 제네릭하게 메서드나 속성을 구현할 수 있도록 연관타입(associatedtype)을 활용한다. 연관타입을 요구사항으로 갖는 프로토콜을 채택하면 해당 연관타입을 각 타입에서 구체화할 수 있고 그 전까지는 명시되지 않는다. 연관타입과 제네릭을 함께 사용 protocol Container{ associatedtype Item // 연관 ..

    [Swift] 제네릭(Generic)

    제네릭 제네릭을 이용해 코드를 구현하면 어떤 타입에도 유연하게 대응할 수 있다. 제네릭으로 구현한 기능과 타입은 재사용하기 쉽고, 코드의 중복을 줄일 수 있다. 타입 파라미터는 함수 내부에서 타입의 이나 리턴형으로 사용된다. 관습적으로 T를 사용하지만 사용하지만 다른문자를 사용해도 되면 Upper camel case를 사용한다. 처럼 2개이상을 선언해도 된다. 제네릭이 필요한 이유 var numA = 10 var numB = 20 print(numA, numB) // 10 20 // 두 숫자를 서로 교환하는 함수 func swapInt(_ a: inout Int, _ b: inout Int){ let tmp = a a = b b = tmp } swapInt(&numA, &numB) print(numA, ..

    @escaping, @autoclosure

    @escaping (탈출) 키워드 원칙적으로 함수의 실행이 종료되면 파라미터로 쓰이는 클로저도 제거된다. @escaping는 클로저를 제거하지 않고 함수(스택프레임)에서 탈출시킨다. (함수가 종료되어도 클로저가 존재하도록 함) 1. 클로저를 단순 실행 ==> non-escaping 클로저 import Foundation func performEscaping1(closure: () -> ()) { print("프린트 시작") closure() } 함수 내부에서 단순 실행하고 종료할 때 클로저를 Heap에 저장할 필요가 없다. @escaping 사용의 대표적인 경우 1. 어떤 함수 내부에 존재하는 클로저(함수)를 외부 변수에 저장하는 경우 ➡️ 파라미터로 받은 클로저를 외부의 변수에 할당하는 경우. Heap..

    [Swift] - 클로저(Clousre)

    클로저(Closure) 클로저는 사용자의 코드 안에서 전달되어 사용할 수 잇는 로직을가진 중괄호"{}"로 구분된 코드 블럭이다. 쉽게 말해 클로저는 이름이 없는 함수이다. 그렇다면 함수는 이름이 있는 클로저일것이다. 클로저와 함수는 기능이 완전히 동일한데, 형태만 다르다고 생각하면 된다. 클로저를 사용하면 따로 함수를 만들어야 할 불편함 없이 즉석에서 함수를 만들 수 있다. 클로저의 형태 함수의 형태 func myFunction(매개변수 이름: 매개변수 타입) -> 반환 타입{ returun 반환타입 } func add(x: Int, y: Int) -> Int{ return(x+y) } print(add(x: 10, y: 20)) // 30 클로저의 형태 { (매개변수이름: 매개변수타입) -> 리턴타입 ..

    [Swift] - UUID 랜덤 고유값 문자 생성

    UUID는 Universally Unique Identifier의 약자이다. 총 36개의 문자열로 구성되어 있고, 이 문자는 32개의 실제 문자(숫자 또는 알파벳)과 4개의 하이픈으로 구성되어있다. (8개의 문자) - (4개의 문자) - (4개의 문자) - (4개의 문자) - (12개의 문자) UUID의 특징 앱을 재실행 시켜도 값은 유지된다. 앱의 공급 업체가 같을 경우, UUID 값도 동일하다. 개인적인 의견으로는, 연동성이 좋다고 생각된다. 만약 A라는 회사가 SNS 어플리케이션을 만들고 추후에 채팅 어플리케이션을 제작했을 때, 유저가 보유한 고유한 UUID 값을 통해 해당 어플리케이션들의 연동이 가능하기 때문이다. 앱을 삭제해도 공급 업체가 제공한 다른 앱이 남아있는 경우, UUID 값은 유지된다..

    [Swift] 확장(extension)

    확장 기존 클래스, 구조체, 열거형 타입에 새로운 Property, Method, Initializer등을 추가하는 것으로, 원본(소스코드)에 접근하지 못하는 타입들도 확장해서 사용할 수 있다. extension이란 키워드를 사용하여 확장한다. 상속은 기존 클래스, 구조체, 열거형 타입을 받아 추가적으로 작성하는 수직형 확장이라면, 확장은 기존 클래스, 구조체, 열거형 타입 자체에 Property, Method, Initializer를 추가하는 수평형 확장. 상속은 저장프로퍼티를 추가 확장은 메서드를 추가 타입을 확장하는 문법. extension SomeType{ } extension SomeType: SomeProtocol, AnotuerProtocol{ } extension을 적고 확장하고자 하는 타..