관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - Swift] Swift 5.7 변경된 점 (if let 옵셔널 바인딩, closure 리턴 키워드 생략, 문자열 regex) 본문

iOS 응용 (swift)

[iOS - Swift] Swift 5.7 변경된 점 (if let 옵셔널 바인딩, closure 리턴 키워드 생략, 문자열 regex)

jake-kim 2022. 11. 23. 10:37

if let 옵셔널 바인딩 개선

  • '=' 기호를 사용하지 않고 옵셔널 바인딩 가능
// 이전
if let data = data {
  print(data)
}

// swift 5.7
if let date {
  print(data)
}

Type Checking 빌드 속도 개선

https://developer.apple.com/videos/play/wwdc2022/110354/

closure 리턴 키워드 생략

  • 단일 표현식에서만 가능했던 closure에서 리턴 키워드 생략이 여러줄이 있는 클로저에서도 적용 가능
// 이전
let newArr = arr.map { val -> String in
    let ret = $0 + 2
    String(ret)
}

// Swift5.7
let arr = [1,2,3]
let newArr = arr.map {
    let ret = $0 + 2
    String(ret) // swift5.7부터 가능
}

제네릭 타입에도 default type 지정이 가능

struct Box<F: Flags> {
  init(flags: F = DefaultFlags()) { ... }
}

Box() // F는 DefaultFlags 타입
Box(flags: CustomFlags())

추가된 문자열 처리 함수

  • ranges(of:)
  • replacing(_:with:)
  • trimmingPrefix(_:)
let message = "the cat sat on the mat"
print(message.ranges(of: "at"))
print(message.replacing("cat", with: "dog")) // the dog sat on the mat
print(message.trimmingPrefix("the ")) // cat sat on the mat
  • 정규식 입력도 가능
print(message.ranges(of: /[a-z]at/))
print(message.replacing(/[a-m]at/, with: "dog"))
print(message.trimmingPrefix(/The/.ignoresCase()))
  • Swift에서 정규식 관련 기능을 추가한 이유
    • 문자열 처리 시 매우 편리하게 처리가 가능

ex) 주어진 문자열 중 이름과 나이만 가져오고 싶은 경우

let greeting1 = "My name is Taylor and I'm 26 years old."
let search1 = /My name is (.+?) and I'm (\d+) years old./

if let result = try? search1.wholeMatch(in: greeting1) {
    print("Name: \(result.1)") // Name: Taylor
    print("Age: \(result.2)") // Age: 26
}

프로토콜을 타입처럼 사용 가능

  • 프로토콜을 타입처럼 사용가능하여, any Eqatable 타입으로 선언한 후 값 입력 가능
let firstName: any Equatable = "Kim"
let lastName: any Equatable = "Jake"
print(lastName as! String == "Jake") // true
print(lastName as! String == "Paul") // false
  • 기존에는 static func ==(lhs: Self, rhs: Self) -> Bool을 정의하여 사용했지만 확장성이 좋지 않아서, 프로토콜도 타입처럼 사용가능하도록 변경

* 이 밖의 변경 사항: https://www.swift.org/blog/swift-5.7-released/

 

* 참고

https://github.com/apple/swift-evolution/blob/main/proposals/0346-light-weight-same-type-syntax.md

https://developer.apple.com/videos/play/wwdc2022/110354/

https://www.swift.org/blog/swift-5.7-released/

 

Comments