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
相关产品推荐
相关产品推荐

