【问题标题】:Cannot assign value of type 'String?' to type 'User?'无法分配“字符串”类型的值?键入“用户?”
【发布时间】:2019-07-25 23:35:12
【问题描述】:

我尝试使用以下代码执行从按钮到特定用户 ID 聊天控制器的转场:

@IBAction func toChatPressed(_ sender: Any) {
    let user = jobDetails?.userID
    let chatLogController = ChatLogController(collectionViewLayout: UICollectionViewFlowLayout())
    chatLogController.user = user
    navigationController?.pushViewController(chatLogController, animated: true)
}

但它给了我无法分配“字符串”类型的值?输入“用户?”作为错误...

chatController.user:

var user: User? {
    didSet {
        navigationItem.title = user?.name
        observeMessages()
    }
}

我得到了从 tableViewCell 传递的用户 ID 并保存在一个结构中

struct JobDetails {
    var jobDetail: String
    var userName: String
    var userImage: UIImage?
    var jobImage: UIImage?
    var downloadURL: String?
    var userLocation: String
    var userID: String?
}

【问题讨论】:

    标签: ios swift firebase


    【解决方案1】:

    chatController 中,属性user 的类型为User,即

    var user: User? {
        ....
    }
    

    现在,在toChatPressed(_:) 方法中,您将userID 的值设置为chatController's user,从您的代码中可以看出,

    let user = jobDetails?.userID 
    

    这里的userIDString?。所以,上面代码中的user 的类型是String?

    chatLogController.user = user 
    

    在上面的代码中,您将userString? 类型)分配给chatLogController.userUser 类型)。这就是你的错误的意思。

    解决方案:

    可以有 2 个选项来解决此问题。

    1.chatLogController 中创建String? 类型的属性userID,即

    var userID: String?
    

    现在,从toChatPressed(_:) 设置它,

    chatLogController.userID = jobDetails?.userID
    

    2. 或者,您可以在toChatPressed(_:) 中使用jobDetails 创建一个User 对象,然后将其设置为chatLogController's user,即

    let user = User(jobDetails) //this depends upon the how you've defined User
    chatLogController.user = user
    

    如果您仍有任何困惑,请随时提问。

    【讨论】:

      【解决方案2】:

      您将JobDetails.userID: String? 分配给ChatLogController.user: User?

      查看您的代码:

          let user = jobDetails?.userID
          …
          chatLogController.user = user
      
      

      您必须将jobDetails?.userID: String 映射到User?

      【讨论】:

      • 老实说,我不知道我是否完全理解你,对不起,我是新手……你能给我完整的解决方案吗?
      • 因为这就是我的问题..我是怎么做到的
      • @DwallaT,您不能将“字符串”值分配给“用户”值。在您的 ChatLogController 中,将属性设置为 String 类型的“用户”
      【解决方案3】:

      在您的struct JobDetails 内,添加一个包含User 对象的新字段:

      struct JobDetails {
          var jobDetail: String
          var userName: String
          var userImage: UIImage?
          var jobImage: UIImage?
          var downloadURL: String?
          var userLocation: String
          var userID: String?
          var user: User? // <-- New field
      }
      

      每当您创建新的JobDetails 时,将User 对象传递给user 字段。

      现在,您的函数可以使用 user 字段而不是 userID 字段:

      @IBAction func toChatPressed(_ sender: Any) {
          let user = jobDetails?.user // <-- user of type User? instead of userID of type String?
          let chatLogController = ChatLogController(collectionViewLayout: UICollectionViewFlowLayout())
          chatLogController.user = user
          navigationController?.pushViewController(chatLogController, animated: true)
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-11
        • 1970-01-01
        相关资源
        最近更新 更多