web-dev-qa-db-ja.com

Swift下付き文字で割り当てることはできません:下付き文字は取得専用です

私はSwift構文にかなり慣れており、「下付き文字を介して割り当てることはできません:下付き文字は取得のみです」というコードでこのエラーを受け取ります

これは次の行からのものです:friendDictionary[(friendUID as? String)!] = ["name": friendsData!["name"]]

それを行う正しい方法についてのアドバイスは非常に役に立ちます。

  func getFriendsUIDs() {

        if FBSDKAccessToken.currentAccessToken() == nil {

            print("failed to start graph request")
            return

        }else{
        }


        if FBSDKAccessToken.currentAccessToken() != nil {
        }

let parameters = ["fields": "name, id, picture"]
FBSDKGraphRequest(graphPath: "/me/friends", parameters: parameters).startWithCompletionHandler {
(NSURLConnection, result, requestError) in
let friendIds = result["id"] as? NSDictionary
let friendsData = friendIds!["data"] as? [NSDictionary]

        var ref: FIRDatabaseReference!
        ref = FIRDatabase.database().reference()
        ref.child("users").child((FIRAuth.auth()?.currentUser?.uid)!).child("friendUIDs").observeEventType(.Value, withBlock: { (snapshot) in
            self.FriendUIDs = NSArray()
            self.FriendUIDs = (snapshot.value as? NSArray)!
            print(self.FriendUIDs)
            var friendDictionary = NSDictionary()
            for friendUID in self.FriendUIDs {
                friendDictionary[(friendUID as? String)!]  = ["name": friendsData!["name"]]
            }

            self.fetchFriendFeed(friendDictionary)
        }) { (error) in
            print(error.localizedDescription)
        }
}

}



func fetchFriendFeed(friendDictionary: NSDictionary) {


var ref: FIRDatabaseReference!
ref = FIRDatabase.database().reference()

for friendUID in FriendUIDs {

    ref.child("users").child(friendUID as! String).child("Agenda").observeEventType(.ChildAdded, withBlock: { (snapshot) in

        print(snapshot)
        if let dictionary = snapshot.value as? [String: AnyObject] {
            let friendPost = FriendPost()
            friendPost.picture = friendDictionary[friendUID as! String]? ["picture"] as? String
            friendPost.activity = dictionary["activity"] as? String
            friendPost.date = dictionary["date"] as? String
            friendPost.time = dictionary["time"] as? String
            friendPost.friendname = friendDictionary[friendUID as! String]?  ["name"] as? String
            self.friendPosts.append(friendPost)

            dispatch_async(dispatch_get_main_queue(), {
                self.collectionView?.reloadData()
11
Darren

Swiftとは関係ありません。 friendDictionaryをNSDictionaryにすることで、実質的にObjective-Cを使用することを選択しました。 NSDictionaryは不変です。それに代入したり、変更することはできません。それは単にObjective-Cに関する事実です。 Swift var宣言は、この事実に影響を与えません。

Swiftで記述しているので、[AnyHashable:Any]()(Swift 3)であるSwift辞書を使用することをお勧めします。 Objective-Cと通信している場合、これはNSDictionaryと交換されますが、varで宣言したので、(適切に)変更可能な辞書になります。

14
matt

NSMutableDictionaryを使用してみましたか?これで問題は解決しました。

7
RossM