2016-11-12 1 views
1

구조체를 생성했는데 데이터로 채 웁니다.Swift3을 사용하여 NSMutableArray의 데이터를 구조체에 채우는 방법

내 구조체 :

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')의 첫 번째 값이있는 tableView에서 알파벳 섹션을 만드는 '이름'의 첫 글자를 보유해야, 나머지 ('이름', ' 세부 사항 ','시간 ') 내 데이터베이스에서 데이터를 보유해야합니다 (3 열 : 이름, 세부 사항, 시간).

내 코드 :

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 

처럼 그 위에 배열을 인스턴스화 매핑 할 수있는 모든의 모든

+0

어떤 종류의 오류가 있습니까? – Robert

답변

1

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])) 
     } 
    } 
} 
0

먼저 감사 :

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

그러나 dict이 제대로 작동하려면 키가 고유해야합니다.

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 = []() 
} 

당신은 당신이 가지고 다음 다른 생성자를 사용하지 않을 경우에만이 개 매개 변수를 사용하여 CrimeNameSection에 대한 생성자를 생성하지 않았기 때문에
여기에 또 다른 문제는 .MAP 함수의 생성자입니다 초기 생성자의 object2 및 object3에 기본값을 제공합니다.

관련 문제