swift 55

Async/Await

async는 함수가 비동기로 처리된다는 것을 의미한다. await은 마킹된 곳은 potential suspension point(잠재적 일시 중단 지점)로 지정된다. async로 선언한 함수가 완료될 때까지 일시 중지 되는 지점이다. □ 예시 func asyncTest() async throws -> String { try await Task.sleep(nanoseconds: 3_000_000_000) //3초 return "sleep 끝" } print("before task") Task{ let string: String = try await asyncTest() print(string) } print("after task") // 출력 // before task // after task // sle..

iOS/Swift 상식 2023.07.23

Swift에서 타입 안전성(type safety)은 어떤 방식으로 보장되나요?

타입 안전성 (type safety) 결론부터 말하자면 Swift는 타입 안전성이 보장이 되어 있는 언어이다. Swift는 타입안정성을 추구하기 때문에 코드를 컴파일할 때 타입 확인 작업을 수행하고 잘못된 타입이 있다면 오류를 표시한다. 이는 개발 과정을 통해 오류를 빠르게 확인하고 수정을 가능하게 만들어서 안전성을 보장하게 된다. Swift 언어를 사용하다 보면 나는 타입을 명시해주지 않았는데 잘 돌아가는 경우가 있을 것이다.이것이 가능한 건 Swift가 타입 추론을 지원해 주는 언어이기 때문이다. let num = 3//타입을 명시하지 않았지만 컴파일 시 Int타입으로 추론 let name = "JJ"//타입을 명시하지 않았지만 컴파일 시 String타입으로 추론 위 예시처럼 타입을 명시해 주지 않아..

iOS/Swift 상식 2023.07.23

Optional Chaining과 nil-coalescing operator(??)의 차이점과 사용 시 주의사항은 무엇인가요?

코딩을 하다보면 구조체 내부에서 또다른 인스턴스가 들어오는 상황이 생긴다. 그러다 보면 프로퍼티를 따라서 들어가는 경우가 생기는데 이때 프로퍼티가 옵셔널인 경우 nil인지 아닌지 확인해야하는 경우가 있다. 예시를 보면 쉽게 알 수 있다. □ Optional Chaining 적용 안한 것 func guardJob(owner: Person?) { if let owner = owner { if let home = home { if let `guard` = home.guard { if let guardJob = `guard`.job { print("우리집 경비원의 직업은 \(guardJob)입니다") } else { print("우리집 경비원은 직업이 없어요") } } } } } □ Optional Chaini..

iOS/Swift 상식 2023.06.26

Codable

Codable = Encodable + Decodable Encodable은 data를 Encoder에서 변환해주려는 프로토콜로 바꿔주는 것 Decodable은 data를 원하는 모델로 Decode 해주는 것 Codable은 프로토콜이라서 Struct, enum, class 전부 채택 가능하다. struct User: Codable { enum CodingKeys: String,CodingKey { case id case name case birth case phoneNum = "phone_num" } let id: Int let name: String let birth: String let phoneNum: String } Enum CodingKeys CodingKeys는 json Key에서 사용하는 ..

iOS/Swift 상식 2023.06.26

Result Type

Result 타입은 Gerneric Enumeration으로 선언되어 있고 연관된 값의 성공과 실패를 나타낸다. 말만 들으면 뭔가 헷갈린다. 정의의 윗부분만 가져와 보았다. @frozen public enum Result where Failure : Error { /// A success, storing a `Success` value. case success(Success) /// A failure, storing a `Failure` value. case failure(Failure) enum 타입으로 구성되어 있고 각 case에 연관된 값을 표현한다 where 문법에 의해 failure의 경우에는 Error 타입만 입력받는다. 뭔지 잘 모를 땐?! 예시를 보면 이해를 쉽게 할 수 있다. enum P..

iOS/Swift 상식 2023.03.25

Some

Swift에서 Some 키워드는 리턴 타입을 자동으로 빠르게 추론할 수 있는 기능이다. 예를 보면서 이해하면 빠르게 이해할 수 있다. protocol Shape{ func describe() -> String } struct Square: Shape{ func describe() -> String { return "I'm Square" } } struct Circle: Shape{ func describe() -> String { return "I'm Circle" } } Shape 프로토콜 내부에 describe() 함수를 선언하고 구조체 Square, Circle을 생성하고 Shape 프로토콜을 상속받는다. 그러면 각 구조체에서 describe() 함수는 오버라이딩할 수 있게 된다. func make..

iOS/Swift 상식 2023.03.25

백준[2110] 공유기 설치 (Swift)

문제를 읽었을 때 문제가 이해가 되지 않아서 3번 정도 읽고, 머리로는 이해했지만 이게 이진탐색이라고.?라는 생각이 곧바로 들었다. 이전 실버 난이도 문제에서는 이진탐색을 이용하겠네 라는 생각이 들고 그 생각을 가지고 살짝 응용한다면 골드 문제부터는 이진탐색을 적용해야 하는 mid, start, end 기준을 스스로 생각하여 정해야 풀 수 있는 문제들인 것 같다. 어렵.. mid 기준만 정하는 게 가장 큰 난관이다.ㅠㅠ import Foundation func findMaxOfMinimum(arr: [Int], start: Int, end: Int, c: Int) -> Int{ var start = start var end = end while start

알고리즘/탐색 2023.03.19

백준[2805] 나무 자르기 (Swift)

해당 문제는 나무를 자른 나머지를 더할 때 total 값이 21억~~~(C++기준)을 넘어갈 까봐 Int32로 했지만 런타임 에러 발생.. 그래서 인터넷에 찾아보니 Swift 기본 자료형 Int는 엄청 범위가 넓다;; 괜한 걱정을 했네..; import Foundation func binarySearchCutTree(arr: [Int], M: Int, start: Int, end: Int) -> Int{ var start: Int = start var end: Int = end var result: Int = 0 while start = mid{ total += data - mid } } if total >= M{ start = mid + 1 result = mid } else{ end = mid - 1..

알고리즘/탐색 2023.03.19

백준[1654] 랜선 자르기 (Swift)

C++을 풀었을 때와 로직은 같지만 Swift에서 지원해주는 라이브러리들이 편리해서 코드를 간결하게 작성할 수 있는 것 같다. import Foundation func binarySearchCutLan(arr: [Int], start: Int, end: Int, target: Int) -> Int{ var start = start var end = end var result = 0 while(start = mid{ total += data / mid } } if total >= target{ start = mid + 1 result = mid } else { end = mid - 1 } } return result } func cutLan(){ let input = readLine()!.split(sep..

알고리즘/탐색 2023.03.19

백준[10816] 숫자 카드 2 (Swift)

swift로 백준 문제를 풀 때는 시간초과를 항상 고려해야한다. 처음에는 C++에서 풀었던 방식으로 배열을 정렬하고 해당 요소의 첫 번째 인덱스와 마지막 인덱스를 구해서 빼려고 했지만 곧바로 시간초과.. ㅠ dictionary를 이용하면 배열을 도는 그런 시간을 아낄 수 있기에 dictionary를 사용하여 문제를 해결하였다. import Foundation func numberCard2(){ let _ = readLine()! var arryM = readLine()!.split(separator: " ").map({Int($0)!}) let _ = readLine()! let arryN = readLine()!.split(separator: " ").map({Int($0)!}) var dict = [..

알고리즘/탐색 2023.03.19