Swift:错误 - 条件绑定的初始化程序必须具有可选类型,而不是' Void' (又名'()')

时间:2017-07-03 18:03:35

标签: ios swift nsuserdefaults optional nskeyedarchiver

使用Swift 3,使用JSON和PHP从MYSQL数据库读取博客阅读器应用程序。用户可以使用关注按钮(以及取消关注按钮)保存他们想要继续获取更新的博客。只需尝试保存跟随的博客ID,而不是保存整个数组,以便应用程序只查找博客ID并显示用户所关注的特定博客。

这是我在加载用户默认值时遇到的错误

  

条件绑定的初始化程序必须具有可选类型,而不是' Void' (又名'()')

此错误位于func loadUserDefaults()的{​​{1}}第一行MainController.swift。 在用户单击跟随按钮后,我在数组之间移动单元格,在tableview中的各个部分之间移动,然后我调用if let data = UserDefaults.

这是saveUserDefaults()

MainController.swift

这是var mainArray = [Blog]() var followedArray = [Blog]() var filteredArray = [Blog]() var followedIdentifiers = Set<String>() override func viewDidLoad() { super.viewDidLoad() // Receiving Data from Server retrieveDataFromServer() // NSCoding - Unarchiving Data (followedID) loadUserDefaults() } // NSCoding: Archiving UserDefaults func saveUserDefaults() { // Saving to UserDefaults let encodedData = NSKeyedArchiver.archivedData(withRootObject: self.followedIdentifiers) UserDefaults.standard.setValue(encodedData, forKey: "followedID") UserDefaults.standard.synchronize() } // NSCoding: Unarchiving UserDefaults *** ERROR IS HERE *** func loadUserDefaults() { // Unarchiving Data -- ERROR: THIS FIRST LINE -- if let data = UserDefaults.standard.setValue(Array(self.followedIdentifiers), forKey: "followedID"), let myFollowedList = NSKeyedUnarchiver.unarchiveObject(with: data) as? [Blog] { self.followedIdentifiers = myFollowedList self.followedIdentifiers = Set(UserDefaults.standard.stringArray(forKey: "followedID")!) } else { print("Error/ Empty: (Loading UserDefaults (followedID))") } } // Retrieving Data from Server func retrieveDataFromServer() { let getDataURL = "http://example.com/receiving.php" let url: NSURL = NSURL(string: getDataURL)! do { let data: Data = try Data(contentsOf: url as URL) let jsonArray = try JSONSerialization.jsonObject(with: data, options: .mutableContainers) as! NSMutableArray // Clear the arrays self.followedArray = [Blog]() self.mainArray = [Blog]() // Looping through jsonArray for jsonObject in jsonArray { if let blog = Blog(jsonObject:jsonObject as! [String : Any]) { // Check if identifiers match if followedIdentifiers.contains(blog.blogID) { self.followedArray.append(blog) } else { self.mainArray.append(blog) } } } } catch { print("Error: (Retrieving Data)") } myTableView.reloadData() } ,它处理所有博客对象和NSCoding

Blog.swift

2 个答案:

答案 0 :(得分:1)

代码行:

let data = UserDefaults.standard.setValue(Array(self.followedIdentifiers), forKey: "followedID")

没有意义,因为setValue方法不返回任何值。 看起来你需要用(Swift 3)替换它:

let data = UserDefaults.standard.data(forKey: "followedID") 
使用@closetCoder评论

更新了

答案 1 :(得分:1)

setValue函数是一个void函数,因此无法将其赋值给变量数据,因为它没有返回值。

以下是Apple的UserDefaults文档:https://developer.apple.com/documentation/foundation/userdefaults