2017-01-30 15 views
0

Так что мой вид таблицы ничего не нагружает, и я думаю, что это из-за этого предупреждения, которое я получаю. Он сказал, что функция сохранения не используется, поэтому как она может загружать что-то, что не сохраняется. Я сохраняю индекс indexPath и раздел строки, которую пользователь выбрал с помощью действия кнопки в строке.Swift Compiler Warning: Результат вызова «save (defaults :)» не используется

Предупреждение:

Результат вызова 'сохранить (по умолчанию :) неиспользован

Код:

func saveSorting(_ dataIdBlock: (Any) -> String) { 

    guard let items = self.items else { return } 

    for (section, rows) in items.enumerated() { 
     for (row, item) in rows.enumerated() { 
      let indexPath = IndexPath(row: row, section: section) 
      let dataId = dataIdBlock(item) 
      let ordering = DataHandling(dataId: dataId, indexPath: indexPath) 

      // Warning is here 
      ordering.save(defaults: indexPath.defaultsKey) 
      } 
     } 
    } 
} 

NSCoder Класс для DataHandling/ordering.save

DataHandling.swift 

class DataHandling: NSObject, NSCoding { 

var indexPath: IndexPath? 
var dataId: String? 

init(dataId: String, indexPath: IndexPath) { 
    super.init() 
    self.dataId = dataId 
    self.indexPath = indexPath 
} 

required init(coder aDecoder: NSCoder) { 

    if let dataId = aDecoder.decodeObject(forKey: "dataId") as? String { 
     self.dataId = dataId 
    } 

    if let indexPath = aDecoder.decodeObject(forKey: "indexPath") as? IndexPath { 
     self.indexPath = indexPath 
    } 

} 

func encode(with aCoder: NSCoder) { 
    aCoder.encode(dataId, forKey: "dataId") 
    aCoder.encode(indexPath, forKey: "indexPath") 
} 

func save(defaults box: String) -> Bool { 

    let defaults = UserDefaults.standard 
    let savedData = NSKeyedArchiver.archivedData(withRootObject: self) 
    defaults.set(savedData, forKey: box) 
    return defaults.synchronize() 

} 

convenience init?(defaults box: String) { 

    let defaults = UserDefaults.standard 
    if let data = defaults.object(forKey: box) as? Data, 
     let obj = NSKeyedUnarchiver.unarchiveObject(with: data) as? DataHandling, 
     let dataId = obj.dataId, 
     let indexPath = obj.indexPath { 
     self.init(dataId: dataId, indexPath: indexPath) 
    } else { 
     return nil 
    } 

} 

class func allSavedOrdering(_ maxRows: Int) -> [Int: [DataHandling]] { 

    var result: [Int: [DataHandling]] = [:] 
    for section in 0...1 { 
     var rows: [DataHandling] = [] 
     for row in 0..<maxRows { 
      let indexPath = IndexPath(row: row, section: section) 
      if let ordering = DataHandling(defaults: indexPath.defaultsKey) { 
       rows.append(ordering) 
      } 
      rows.sort(by: { $0.indexPath! < $1.indexPath! }) 
     } 
     result[section] = rows 
    } 

    return result 

    } 

} 

Другой код, я использую:

// Number of Rows in Section 
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    return self.items?[section].count ?? 0 
} 

// Number of Sections 
func numberOfSections(in tableView: UITableView) -> Int { 

    return self.items?.count ?? 0 
} 

Сохранение его:

saveSorting() { "\($0)" } 

Загрузка его в ViewDidLoad:

func fetchData() { 

    // Load Data from Server to testArray 
    retrieveData() 

    // request from remote or local 
    data = [testArray] 

    // Update the items to first section has 0 elements, 
    // and place all data in section 1 
    items = [[], data ?? []] 

    // apply ordering 
    applySorting() { "\($0)" } 

    // save ordering 
    saveSorting() { "\($0)" } 

    // refresh the table view 
    myTableView.reloadData() 
} 

Загрузка Код:

// Loading 
func applySorting(_ dataIdBlock: (Any) -> String) { 

    // get all saved ordering 
    guard let data = self.data else { return } 
    let ordering = DataHandling.allSavedOrdering(data.count) 

    var result: [[Any]] = [[], []] 

    for (section, ordering) in ordering { 
     guard section <= 1 else { continue } // make sure the section is 0 or 1 
     let rows = data.filter({ obj -> Bool in 
      return ordering.index(where: { $0.dataId == .some(dataIdBlock(obj)) }) != nil 
     }) 
     result[section] = rows 
    } 

    self.items = result 
} 
+2

Перед отправкой обязательно [поиск по ошибке] (http://stackoverflow.com/search?q=%5Bswift%5D+Result+of+call+to+is+unused). – rmaddy

+0

[@discardableResult] (https://github.com/apple/swift-evolution/blob/master/proposals/0047-nonvoid-warn.md) может подавить ваше предупреждение –

ответ

4

DataHandling инст Функция ance's save(defaults:) технически возвращает значение, даже если вы его не используете. Чтобы отключить это предупреждение, присвоить его _, чтобы показать, что вы не собираетесь использовать значение результата, например:

_ = ordering.save(defaults: indexPath.defaultsKey) 

или

let _ = ordering.save(defaults: indexPath.defaultsKey) 

Просто чтобы быть ясно, это почти определенно не почему ваш tableview не загружает данные. Это должно быть довольно незначительно. indexPath.defaultsKey: сохраняется (при условии, что работает API).

+0

Так я правильно загружаю его, если его сохраняют? Любая идея о том, почему таблица не загружается? Я был бы признателен за помощь. – BroSimple

+0

Сложно сказать, так как я не знаком с этим API «DataHandling». Вы бросили в некоторые точки останова, чтобы увидеть, где код и не достигает? Я бы не удивился, если есть некоторые ошибки синтаксического анализа, учитывающие всю логику архивирования/разборки и кодирования/декодирования. Трудно отлаживать что-то вроде этого, не запуская код локально. @BroSimple –

+0

Я включил код DataHandling, если вам это нужно, я мог бы попробовать использовать контрольные точки. У меня есть проект на github, если вы не возражаете помочь мне? Вы можете получить кредит на этот вопрос, а другой - у меня есть открытый вопрос по той же проблеме? – BroSimple