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

Swift 4.1中String转Double遇属性初始化错误:无法使用实例成员

解决Swift中属性初始化器无法引用实例成员的问题

嘿,我来帮你搞定这个报错~ 你遇到的这个问题,根源在于存储属性的初始化顺序规则:当你在类/结构体里直接定义存储属性并赋值时,这些属性的初始化是在self完全准备好之前运行的,所以你没法在一个存储属性的初始化里引用另一个存储属性(比如用getLongijson来初始化jsonlong)。

下面给你几个可行的解决方案:

方案1:改用计算属性

把jsonlong和jsonlat改成计算属性,这样它们的值会在被访问时才计算,避开初始化顺序的限制:

class YourClass {
    let getLongijson: String = "67.0011"
    let getlatijson: String = "24.8607"
    
    // 计算属性,每次访问时才转换值
    var jsonlong: Double {
        return (getLongijson as NSString).doubleValue
    }
    
    var jsonlat: Double {
        return (getlatijson as NSString).doubleValue
    }
}

方案2:在初始化方法里按顺序赋值

如果你需要jsonlong和jsonlat是存储属性,可以把所有属性的赋值都移到初始化方法里,这样就能保证顺序正确:

class YourClass {
    let getLongijson: String
    let getlatijson: String
    let jsonlong: Double
    let jsonlat: Double
    
    init() {
        // 先初始化字符串属性
        getLongijson = "67.0011"
        getlatijson = "24.8607"
        // 再用已初始化的字符串转换数值
        jsonlong = (getLongijson as NSString).doubleValue
        jsonlat = (getlatijson as NSString).doubleValue
    }
}

方案3:用Swift原生的Double初始化器(更推荐)

其实Swift本身就支持直接把字符串转成Double,不用依赖NSString的桥接,还能处理转换失败的情况(比如字符串不是合法数字时返回nil),举个例子:

class YourClass {
    let getLongijson: String = "67.0011"
    let getlatijson: String = "24.8607"
    
    // 可选类型,转换失败时为nil
    var jsonlong: Double? {
        return Double(getLongijson)
    }
    
    // 或者给个默认值,避免可选类型
    var jsonlat: Double {
        return Double(getlatijson) ?? 0.0
    }
}

内容的提问来源于stack exchange,提问作者Rehan Meo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:33:11