development

Swift 3 UnsafePointer ($ 0)는 더 이상 Xcode 8 베타 6에서 컴파일되지 않습니다.

big-blog 2020. 12. 3. 08:06
반응형

Swift 3 UnsafePointer ($ 0)는 더 이상 Xcode 8 베타 6에서 컴파일되지 않습니다.


다음과 같이 내 코드 스 니펫 ... :

    let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
        SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
    }

… 내가 이해할 수없는 다음 오류로 더 이상 컴파일되지 않습니다.

"'init' is unavailable: use 'withMemoryRebound(to:capacity:_)' to temporarily view memory as another layout-compatible type."

어떻게 해결해야합니까?


Xcode 8 베타 6의 릴리스 정보에서 발췌 :

  • Unsafe[Mutable]RawPointer유형 대체 도입되었다 Unsafe[Mutable]Pointer<Void>. 에서 변환 UnsafePointer<T>에이 UnsafePointer<U>허용되고있다. Unsafe[Mutable]RawPointer유형이 지정되지 않은 메모리 액세스를위한 API와 메모리를 유형에 바인딩하는 API를 제공합니다. 바인딩 메모리는 포인터 유형 간의 안전한 변환을 허용합니다. 참조 bindMemory(to:capacity:), assumingMemoryBound(to:)withMemoryRebound(to:capacity:). (SE-0107)

귀하의 경우 다음과 같이 작성해야 할 수도 있습니다.

let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
    $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {zeroSockAddress in
        SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)
    }
}

바꾸다

let defaultRouteReachability = withUnsafePointer(to: &zeroAddress) {
  SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0))
}

guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, {

        $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {

            SCNetworkReachabilityCreateWithAddress(nil, $0)

        }

    }) else {

        return false
    }

Swift 3은 구문을 업데이트했으며 정확한 해결책은

guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, {
    $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
        zeroSockAddress in SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)} 
} ) else { 
    return false 
}

참고 URL : https://stackoverflow.com/questions/39046377/swift-3-unsafepointer0-no-longer-compile-in-xcode-8-beta-6

반응형