繁体   English   中英

如何使用Swift3将NSMutableArray中的数据填充到结构中

[英]How to populate data from NSMutableArray into struct using Swift3

我已经创建了一个结构,我想用我的数据填充它。

我的结构:

struct CrimeNameSection {

var firstChar: Character
var name: [String]
var detail: [String]
var time: [String]


init(firstLetter: Character, object1: [String], object2: [String], object3: [String]) {

    firstChar = firstLetter // First letter of 'name'
    name = object1
    detail = object2
    time = object3
}

我的结构的第一个值('firstChar')应该保存'name'中的第一个字母以在tableView中创建字母部分,其余的内容('name','detail','time')应该保存我数据库中的数据(三列:名称,详细信息,时间)。

我的代码:

var marrCrimesData : NSMutableArray! // Hold the database

func getSectionsFromData() -> [CrimeNameSection] {
    guard marrCrimesData != nil else {
        return []
    }


    var sectionDictionary =  [CrimeNameSection]()
    for crime in marrCrimesData {
        let crime = crime as! CrimesInfo
        let firstChar = CrimeNameSection(firstLetter: crime.name[crime.name.startIndex], object1: [crime.name], object2: [crime.detail], object3: [crime.time])
        if var names = firstChar {
            names.append(crime.name)
            sectionDictionary[firstChar] = names
        } else {
            sectionDictionary[firstChar] = [crime.name]
        }
    }

    let sections = sectionDictionary.map { (key, value) in
        return CrimeNameSection(firstLetter: key, name: value)
    }
    let sortedSections = sections.sorted { $0.firstLetter < $1.firstLetter }

    return sortedSections 
}

我到处都是错误,我需要帮助将数据存储在结构中并按字母顺序排序。 谢谢你们

首先,您无法实例化数组并像字典一样映射它

var sectionDictionary = [CrimeNameSection]() // Here you are init an Array

对于字典,还必须指定键,例如,如果键是字符串:

var sectionDictionary = [String: CrimeNameSection]() // Dictionary init

但是请注意,密钥必须唯一,以便字典可以正常工作。
这里的另一个问题是您的.map函数中的构造函数,因为您没有为CrimeNameSection创建仅包含两个参数的构造函数:

init(firstLetter: Character, object1: [String], object2: [String], object3: [String]) {

    firstChar = firstLetter // First letter of 'name'
    name = object1
    detail = object2
    time = object3
}

// Another constructor with 2 arguments
 init(firstLetter: Character, object1: [String]) {

    firstChar = firstLetter // First letter of 'name'
    name = object1
    detail = []()
    time = []()
}

如果您不想使用其他构造函数,则必须在初始构造函数中为object2和object3提供默认值。

考虑

struct Crime {
    let name: String
    let detail: String
    let time: String
}

let crimes = [
    Crime(name: "Foo", detail: "detail 1", time: "9am"),
    Crime(name: "Bar", detail: "detail 2", time: "10am"),
    Crime(name: "Baz", detail: "detail 3", time: "11am"),
    Crime(name: "Qux", detail: "detail 4", time: "12am")
]

一种方法是只构建一个按第一个字符索引的字典,然后对其进行排序:

var crimeIndex = [Character: [Crime]]()
for crime in crimes {
    if let firstCharacter = crime.name.characters.first {
        if crimeIndex[firstCharacter] == nil {
            crimeIndex[firstCharacter] = [crime]
        } else {
            crimeIndex[firstCharacter]?.append(crime)
        }
    }
}

let sortedIndex = crimeIndex.sorted { $0.0 < $1.0 }

上面的优点是我们可以使用字典来有效地找到该部分。 如果你真的想用您的自定义“名节”结构,我想先让它使用数组Crime对象(具有的属性脱节阵列Crime可以是脆弱的,例如,如果你决定添加的分类罪行)。 因此可能看起来像:

struct CrimeNameSection {
    let firstCharacter: Character
    var crimes: [Crime]
}

而且,由于我们失去了查找索引的Dictionary效率,并通过手动查找该节来进行迭代,因此我将继续进行一次插入排序,从而使我不必再进行其他排序:

var crimeSections = [CrimeNameSection]()
for crime in crimes {
    if let firstCharacter = crime.name.characters.first {
        var hasBeenAdded = false

        for (index, crimeIndex) in crimeSections.enumerated() {
            if firstCharacter == crimeIndex.firstCharacter {  // if we found section, add to it
                crimeSections[index].crimes.append(crime)
                hasBeenAdded = true
                break
            }
            if firstCharacter < crimeIndex.firstCharacter {   // if we've passed where the section should have been, insert new section
                crimeSections.insert(CrimeNameSection(firstCharacter: firstCharacter, crimes: [crime]), at: index)
                hasBeenAdded = true
                break
            }
        }

        // if we've gotten to the end and still haven't found section, add new section to end

        if !hasBeenAdded {
            crimeSections.append(CrimeNameSection(firstCharacter: firstCharacter, crimes: [crime]))
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM