You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xcode 9中Swift 4可达性函数报错:如何修复'takeRetainedValue'不存在问题?

解决Xcode 9中Reachability类的takeRetainedValue错误问题

嘿,这个问题我之前也踩过坑!根源是Swift版本升级带来的API变化——在Swift 3及之后(Xcode 9对应的是Swift 4),SystemConfiguration框架里的SCNetworkReachabilityCreateWithAddress方法返回值类型变了,不再是Unmanaged<SCNetworkReachability>?,所以你完全不需要再调用takeRetainedValue()来处理内存托管了,直接用返回的可选值就行。

给你修正后的完整Reachability类代码,替换你原来的实现就能解决这个错误:

import UIKit
import Foundation
import SystemConfiguration

public class Reachability {
    class func isConnectedToNetwork() -> Bool {
        var zeroAddress = sockaddr_in()
        zeroAddress.sin_len = UInt8(MemoryLayout<sockaddr_in>.size)
        zeroAddress.sin_family = sa_family_t(AF_INET)
        
        // 安全获取网络可达性对象,无需takeRetainedValue
        guard let reachability = withUnsafePointer(to: &zeroAddress, {
            $0.withMemoryRebound(to: sockaddr.self, capacity: 1) {
                SCNetworkReachabilityCreateWithAddress(nil, $0)
            }
        }) else {
            return false
        }
        
        var flags: SCNetworkReachabilityFlags = []
        if !SCNetworkReachabilityGetFlags(reachability, &flags) {
            return false
        }
        
        // 判断是否可达且不需要额外连接
        let isReachable = flags.contains(.reachable)
        let needsConnection = flags.contains(.connectionRequired)
        
        return isReachable && !needsConnection
    }
}

几个关键修改点:

  • 移除了过时的takeRetainedValue()调用,直接用可选绑定处理SCNetworkReachabilityCreateWithAddress的返回值
  • 用MemoryLayout动态获取sockaddr_in的大小,替代原来手动初始化的方式,更符合Swift的类型安全规范
  • 增加了安全的可选绑定和错误处理,避免强制解包可能引发的崩溃

内容的提问来源于stack exchange,提问作者Mr White

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:21:22