我有一个返回 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/