swift - 如何从获取请求数组结果中分配键,并从空字典中的文本字段输入中分配值?

标签 swift dictionary core-data swift3

我有一个返回 Floors 实体对象数组的获取请求。对于每个楼层实体,我都为“每层房间数”属性分配了一个值。下一个 vc 是一个表,其中楼层数需要是部分,每层房间的数量需要是该部分内的单元格。所以,我能想到的最方便的方法是通过字典 [floor: roomsInFloor] 来为 segue 做准备。问题是我不知道如何为空字典设置键和值。我尝试了一下,但它不是正确的,而且我在网站上找不到任何有用的示例。有人可以向我解释如何做到这一点吗?请看下面的代码。谢谢。

class SetNumberOfRoomsPerFloor: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {

//MARK: - Properties

@IBOutlet private weak var floorPicker: UIPickerView!

@IBOutlet private weak var numberOfRoomsPerFloor: UITextField!

private var managedObjectContext: NSManagedObjectContext!

internal var floorValue: Int16?

private var convertedFloorValues = [String]()

private var storedFloors = [Floors]()

private var pickedFloor: Int16?

private var roomNumberValue: Int16 {
    get {
        return Int16(numberOfRoomsPerFloor.text!)!
    }
}

private var floorsAndRooms = [String: String]()

override func viewDidLoad() {
    super.viewDidLoad()
    managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    floorPicker.delegate = self
    floorPicker.dataSource = self
    loadFloorData()
    spinnerItems()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
}

@IBAction func setTheFloors(_ sender: UIButton) {
    if storedFloors.count > 0 {
        if storedFloors.first?.floorNumber == pickedFloor! {
            storedFloors.first?.numberOfRooms = roomNumberValue
            print("\(storedFloors.first?.floorNumber) + \(storedFloors.first?.numberOfRooms)")
        }
    }
}

private func setTheDictionary() { // this is not correct!
    for i in 0...storedFloors.count - 1 {
        floorsAndRooms.updateValue(String(describing: storedFloors.first?.numberOfRooms), forKey: String(i))
    }
    print("\(floorsAndRooms.count)")
}

@IBAction func nextStep(_ sender: UIButton) {

}

private func loadFloorData() {
    let floorRequest: NSFetchRequest<Floors> = Floors.fetchRequest()
    do {
        storedFloors = try managedObjectContext.fetch(floorRequest)
    } catch {
        print("could not load data from core \(error.localizedDescription)")
    }
}

private func spinnerItems() {
    for i in 0...floorValue! - 1 {
        convertedFloorValues.append(String(i))
}
// MARK: - Navigation

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

}



public func numberOfComponents(in pickerView: UIPickerView) -> Int {
    return 1
}
func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    return convertedFloorValues.count
}
func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    return convertedFloorValues[row]
}

func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    print("\(convertedFloorValues)")
    let selection = Int16(convertedFloorValues[row]) // not sure I have to do this part.
    pickedFloor = selection
}

最佳答案

我认为这可能是您正在寻找的:

private func setTheDictionary() {
    for floor in storedFloors {
        floorsAndRooms["\(floor.floorNumber)"] = "\(floor.numberOfRooms)"
    }
}

您可能想查看 Apple's Swift Programming Guide .这个很不错。有关控制流(用于迭代)和集合(用于字典)的部分应该非常相关。 (这是 Swift 3 版本的链接。)

另外,请注意您没有为 fetchRequest 提供任何 sortDescriptors。所以你从 CoreData 得到的数组不会有任何特定的顺序,即它不会按照楼层数的顺序。没关系,因为它是。您不需要对结果进行排序,因为您将它们存储在字典中,而字典也没有排序。只知道当您检查获取的数组时,它的元素不会按顺序排列。

关于swift - 如何从获取请求数组结果中分配键,并从空字典中的文本字段输入中分配值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43003861/

相关文章:

python - 字典中 4 个和 3 个元素的组合

python - python中字典键的差异操作

ios - 为什么核心数据不是 ORM

swift - 从 Firebase 获取值并将其附加到 Swift 中的数组中?

ios - TapGestureRecognizer 调用另一个类中的函数并访问第一类的变量

ios - "' CGFloat ' is not convertible to ' UInt8 '"- CGFloat 包装问题

ios - 如何扩展 Swift Dictionary 类型以返回非空 String 或 nil

python - 在 Python 中附加到嵌套列表或字典

objective-c - 为什么我的 NSManagedObject 不兼容 KVC?

ios - 在提交中点击删除后 TableView 没有升级?