관리 메뉴

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

[iOS - swift] 1. swift 5.8 정리 - implicit self, magic file name, collection downcast 본문

iOS 응용 (swift)

[iOS - swift] 1. swift 5.8 정리 - implicit self, magic file name, collection downcast

jake-kim 2023. 4. 9. 01:31

1. swift 5.8 정리 - implicit self, magic file name, collection downcast < 

2. swift 5.8 정리 - optional generic, lazy var, @backDeployed

Swift5.8 Release

  • 2023년 3월 30일 출시
  • Xcode 14.3부터 사용 가능

implicit self

  • SE-0365
  • weak self 캡쳐한 클로저 내부에서 guard let self else { return } 한번만 선언하면 self 생략 가능
  • swift5.7에서는 아래처럼 에러가 발생하지만 swift5.8에서는 가능
class MyClass {
    let value = 1
    
    init() {
        someFunc { [weak self] in
            guard let self else { return }
            print(value) // error: reference to property 'value' in closure requires explicit use of 'self' to make capture semantics explicit
        }
    }

    func someFunc(completion: @escaping () -> ()) {
        print("test")
    }
}
  • nested closure에서는 안되는것을 주의
someFunc { [weak self] in
    guard let self else { return }
    print(value)
    
    someFunc2 {
        print(value) // error!
    }
}

magic file name

  • SE-0274
  • #file, #filePath 경로 변경
    • swift5.7에서는 #file을 입력해도 #filePath와 동일하게 전체 경로를 보여주었지만, swift5.8부터는 {Module}/{file} 정보만 획득이 가능
    • 단, Xcode의 Build Settings > Other Swift Flags에 특정 값 추가가 필요 -Xfrontend -enable-experimental-concise-pound-file

xcode > Target > Build Settings > Other Swift Flags에 추가

  • -Xfrontend -enable-experimental-concise-pound-file

 

fn1()
fn2()

func fn1(file: String = #filePath) {
    print(file) // /Users/jake/Desktop/Ex5_8/Ex5_8/ViewController.swift
}
func fn2(file: String = #file) {
    print(file) // Ex5_8/ViewController.swift
}

 

Collection Downcast

  • Parent 타입의 인스턴스를 child 타입으로 캐스팅하는 다운캐스팅이 collection 타입도 사용이 가능
  • swift5.7에서는 collection 타입 캐스팅이 아래처럼 불가능했지만 swift5.8에서는 가능
// 참고: https://www.hackingwithswift.com/articles/256/whats-new-in-swift-5-8

class Pet { }
class Dog: Pet {
    func bark() { print("Woof!") }
}

func bark(using pets: [Pet]) {
    switch pets {
    case let pets as [Dog]: // error: collection downcast in cast pattern is not implemented; use an explicit downcast to '[Dog]' instead
        for pet in pets { 
            pet.bark()
        }
    default:
        print("No barking today.")
    }
}

* 이밖의 Swift5.8의 변경 사항들은 swift evolution 참고

* 참고

https://github.com/apple/swift-evolution/blob/main/proposals/0274-magic-file.md

https://github.com/apple/swift-evolution/blob/main/proposals/0365-implicit-self-weak-capture.md

https://www.hackingwithswift.com/articles/256/whats-new-in-swift-5-8

Comments