简体   繁体   English

Swift Firebase“无法将类型为“信息”的值分配为类型为“ NSDictionary?”

[英]Swift Firebase “Cannot assign value of type 'Information' to type 'NSDictionary?'”

I have a tableview that is being populated with who a user is following. 我有一个正在填充用户关注谁的表视图。 Problem is that I need to pass that cells data to "var otherUser: NSDictionary!" 问题是我需要将该单元格数据传递给“ var otherUser:NSDictionary!”。 but because I am populating the cell using a data structure file called "Information" I get this error - "Cannot assign value of type 'Information' to type 'NSDictionary?'" in the prepareForSegue. 但是由于我使用名为“信息”的数据结构文件填充单元格,因此出现了此错误-“在prepareForSegue中无法将类型为“信息”的值分配为类型为“ NSDictionary?””。 I am unsure if I can repackage the information I need into a NSDictionary so I can successfully do a data pass. 我不确定是否可以将所需的信息重新打包到NSDictionary中,以便我可以成功进行数据传递。 I just don't know if this is a easy solution or an actual problem because of my ignorance. 由于我的无知,我只是不知道这是一个简单的解决方案还是一个实际的问题。

Following TableViewController Code 以下TableViewController代码

import UIKit
import Firebase

class BusinessFollowing: UITableViewController {

@IBOutlet var noDataView: UIView!
@IBOutlet var followingTableView: UITableView!

var yourFollowing = [Information]()

var listFollowing = [NSDictionary?]()
var databaseRef = Database.database().reference()
let uid = Auth.auth().currentUser?.uid


var loggedInUser = Auth.auth().currentUser
var loggedInUserData:NSDictionary?

var following = [String]()

override func viewDidLoad() {
    super.viewDidLoad()

    self.followingTableView.backgroundView = nil


}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    self.followingTableView.reloadData()
    self.yourFollowing.removeAll()
    self.following.removeAll()

    getFollowingData()

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    super.prepare(for: segue, sender: sender)
    if segue.identifier == "following" {
        // gotta check if we're currently searching
            if let indexPath = followingTableView.indexPathForSelectedRow {
                let user = self.yourFollowing[indexPath.row]
                let controller = segue.destination as? ExploreBusinessProfileSwitchView
                controller?.otherUser = user
            }
    }
}

override func numberOfSections(in tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return self.yourFollowing.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! BusinessFollowingCell
    let following = yourFollowing[indexPath.row]

    let businessName = following.businessName
    let businessStreet = following.businessStreet
    let businessCity = following.businessCity
    let businessState = following.businessState

    cell.businessName.text = businessName
    cell.businessStreet.text = businessStreet
    cell.businessCity.text = businessCity
    cell.businessState.text = businessState

    // cell.businessName?.text = self.listFollowing[indexPath.row]?["businessName"] as? String
    // cell.businessStreet?.text = self.listFollowing[indexPath.row]?["businessStreet"] as? String
    // cell.businessCity?.text = self.listFollowing[indexPath.row]?["businessCity"] as? String
    // cell.businessState?.text = self.listFollowing[indexPath.row]?["businessState"] as? String

    return cell
}

func getFollowingData() {
    self.yourFollowing.removeAll()
    self.following.removeAll()
    self.followingTableView.reloadData()

    Database.database().reference().child("Businesses").child((loggedInUser?.uid)!).child("following").observe(.value, with: { snapshot in
        if snapshot.exists() {
            MBProgressHUD.showAdded(to: self.view, animated: true)
            let databaseRef = Database.database().reference()
            databaseRef.child("Businesses").queryOrderedByKey().observeSingleEvent(of: .value, with: { (usersSnapshot) in
                let users = usersSnapshot.value as! [String: AnyObject]
                for (_, value) in users {
                    if let userID = value["uid"] as? String {
                        if userID == Auth.auth().currentUser?.uid {
                            print(value)
                            if let followingUsers = value["following"] as? [String : String] {
                                for (_,user) in followingUsers {
                                    self.following.append(user)
                                }
                            }
                            databaseRef.child("following").queryOrderedByKey().observeSingleEvent(of: .value, with: { (postsSnapshot) in
                                let posts = postsSnapshot.value as! [String: AnyObject]

                                for (_, post) in posts {
                                    for (_, postInfo) in post as! [String: AnyObject] {
                                        if let followingID = postInfo["uid"] as? String {
                                            for each in self.following {
                                                if each == followingID {
                                                    guard let uid = postInfo["uid"] as! String? else {return}
                                                    guard let name = postInfo["businessName"] as! String? else {return}
                                                    guard let address = postInfo["businessStreet"] as! String? else {return}
                                                    guard let state = postInfo["businessState"] as! String? else {return}
                                                    guard let city = postInfo["businessCity"] as! String? else {return}

                                                    self.yourFollowing.append(Information(uid: uid, businessName: name, businessStreet: address, businessCity: city, businessState: state))
                                                }

                                                self.followingTableView.backgroundView = nil
                                                self.followingTableView.reloadData()
                                            }
                                        }
                                    }
                                }
                                MBProgressHUD.hide(for: self.view, animated: true)
                            }) { (error) in
                                print(error.localizedDescription)
                            }
                        }
                    }
                }

            })
        } else {
            print("Not following anyone")
            self.followingTableView.backgroundView = self.noDataView
            MBProgressHUD.hide(for: self.view, animated: true)
        }
    })

}

}

"Information" Data Structure File “信息”数据结构文件

import UIKit

class Information {

var uid: String
var businessName: String
var businessStreet: String
var businessCity: String
var businessState: String


init(uid: String, businessName: String, businessStreet: String, businessCity: String, businessState: String){

    self.uid = uid
    self.businessName = businessName
    self.businessStreet = businessStreet
    self.businessCity = businessCity
    self.businessState = businessState
}

}

The error is pretty clear. 错误非常明显。

user in ExploreBusinessProfileSwitchView is obviously declared as NSDictionary , declare it as Information . ExploreBusinessProfileSwitchView user显然声明为NSDictionary ,声明为Information

By the way don't use NSArray / NSDictionary in Swift. 顺便说一句,不要在Swift中使用NSArray / NSDictionary Use native types. 使用本机类型。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 无法分配“ NSDictionary”类型的值? 键入“字符串?” - Cannot assign value of type 'NSDictionary?' to type 'String?' Swift中的Firebase。 无法将类型“ NSNull”的值转换为“ NSDictionary” - Firebase in Swift. Cannot cast value of type 'NSNull' to 'NSDictionary' Swift中的NSDictionary:不能下标“AnyObject”类型的值吗? 索引类型为'Int' - NSDictionary in Swift:Cannot subscript a value of type 'AnyObject?' with a index of type 'Int' Swift不能指定类型'()'的值来键入'String?' - Swift cannot assign value of type '()' to type 'String?' 无法将“NSTaggedPointerString”类型的值转换为“NSDictionary”。 斯威夫特/火力地堡 - Could not cast value of type 'NSTaggedPointerString' to 'NSDictionary'. Swift/Firebase Swift:无法指定'Item'类型的值?输入'Item?.Type' - Swift: Cannot assign value of type 'Item?' to type 'Item?.Type' 无法将“Int”类型的值分配给“Int?.Type”类型 Swift 5 - Cannot assign value of type 'Int' to type 'Int?.Type' Swift 5 SWIFT:无法分配类型…/ SwiftyJSON的值 - SWIFT : Cannot assign value of type … / SwiftyJSON Swift无法分配'UINavigationController'类型的值 - Swift cannot assign value of type 'UINavigationController' 无法将类型“ [String]”的值分配给类型“ [MovieVO]”的值-Swift - Cannot assign a value of type '[String]' to a value of type '[MovieVO]' - Swift
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM