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 빌드 속도 개선

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/