2016-08-19 19 views
58

đang snipet tôi như sau ...:

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

... không không còn biên dịch với các lỗi sau mà tôi không hiểu:

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

Việc cần làm để khắc phục sự cố?

+3

Lưu ý rằng http://stackoverflow.com/a/25623647/1187415 đã được cập nhật cho Swift hiện tại 3. –

Trả lời

119

Từ Release Notes của Xcode 8 beta 6:

  • Một Unsafe[Mutable]RawPointer loại đã được giới thiệu, thay thế Unsafe[Mutable]Pointer<Void>. Chuyển đổi từ UnsafePointer<T> thành UnsafePointer<U> không được phép. Unsafe[Mutable]RawPointer cung cấp API cho truy cập bộ nhớ chưa được phân loại và API để ràng buộc bộ nhớ với một loại. Bộ nhớ ràng buộc cho phép chuyển đổi an toàn giữa các loại con trỏ . Xem bindMemory(to:capacity:), assumingMemoryBound(to:), và withMemoryRebound(to:capacity:). (SE-0107)

Trong trường hợp của bạn, bạn có thể cần phải viết một cái gì đó như thế này:

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

Có, Nó phù hợp với tôi..Cảm ơn – TBI

18

Thay

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

với

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

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

      SCNetworkReachabilityCreateWithAddress(nil, $0) 

     } 

    }) else { 

     return false 
    } 
5

Swift 3 cập nhật cú pháp, giải pháp chính xác là,

guard let defaultRouteReachability = withUnsafePointer(to: &zeroAddress, { 
    $0.withMemoryRebound(to: sockaddr.self, capacity: 1) { 
     zeroSockAddress in SCNetworkReachabilityCreateWithAddress(nil, zeroSockAddress)} 
}) else { 
    return false 
} 
Các vấn đề liên quan