无法推断类型

Posted

技术标签:

【中文标题】无法推断类型【英文标题】:Could not infer type for 【发布时间】:2018-01-03 08:30:37 【问题描述】:

我正在创建一个 Web API 来从服务器获取数据并使用 AlamoFire 和 SwiftyJSON。

为什么会出现错误“Could not infer type for i) 在其自身类型中使用的“地址” ii) 使用未解析的标识符“userAddress(addressJSON:)” " 请帮我解决这个错误?

import Foundation
import SwiftyJSON

class user 

    var name = String()
    var uname = String()
    var email = String()
    var phone = String()
    var address = userAddress?()
    var company = userCompany?()

    init(userJSON : JSON) 
        self.name = userJSON["name"].stringValue
        self.uname = userJSON["username"].stringValue
        self.phone = userJSON["phone"].stringValue
        self.email = userJSON["email"].stringValue

        self.address = userAddress(addressJSON:userJSON["address"])
        self.company = userCompany(companyJSON:userJSON["company"])
    



class userAddress 

    var street = String()
    var city = String()

    init(addressJSON: JSON) 

        self.street = addressJSON["street"].stringValue
        self.city = addressJSON["city"].stringValue
    


class userCompany 

    var companyName = String()
    var phrase = String()

    init(companyJSON: JSON) 

        self.companyName = companyJSON["name"].stringValue
        self.phrase = companyJSON["catchPhrase"].stringValue
    

【问题讨论】:

【参考方案1】:

首先,结构和类名应该以大写字母开头

您的代码暗示 JSON 提供所有值,因此没有可选项。

如果有一个初始化器,那么用默认值声明属性是非常糟糕的习惯。声明 var name : String 完全没问题。

class User 

    var name : String
    var uname : String
    var email : String
    var phone : String
    var address : UserAddress
    var company : UserCompany

    init(userJSON : JSON) 
        self.name = userJSON["name"].stringValue
        self.uname = userJSON["username"].stringValue
        self.phone = userJSON["phone"].stringValue
        self.email = userJSON["email"].stringValue

        self.address = UserAddress(addressJSON:userJSON["address"])
        self.company = UserCompany(companyJSON:userJSON["company"])
    



class UserAddress  ...

class UserCompany  ...

注意:

在 Swift 4 中,JSONDecoderSwiftyJSON 方便得多

【讨论】:

你能解释更多声明这个var name = String而不是var name = String()吗? 如果在init 方法中分配了属性的初始值,则仅声明类型就足够(并且建议)。它满足规则在创建该类或结构的实例时,类和结构必须将其所有存储的属性设置为适当的初始值。您甚至可以将属性声明为常量let name : String @vadian 为什么这么认为? 在 Swift 4 中 JSONDecoder 比 SwiftyJSON 方便很多 @NazmulHasan 因为在使用 JSONDecoder 时内置了将 JSON 解析为结构的功能。整个代码可以大大减少。

以上是关于无法推断类型的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 SwiftUI 推断复杂的闭包返回类型

在 Kotlin 中无法“findViewById”。收到错误“类型推断失败”

通用扩展方法:无法从用法推断类型参数

无法从 TypeScript 反射系统推断 GraphQL 类型

无法从用法中推断出类型参数。尝试明确指定类型参数

SwiftUI 如何修复“无法推断复杂的闭包返回类型;添加显式类型以消除歧义”