2017-03-07 14 views
2

중첩 for 루프를 사용하지 않고 아래 AllData에서 "names"문자열을 포함하는 Array를 가져 오는 효율적인 방법이 있습니까? "앨리스", "브래드 스미스 MD", "닥터 캄", "제니퍼 존슨", "존 뱅크스 MD"가 출력으로 작동하지만 코드가 효과적이지 않기 때문에 중첩 된 루프없이이를 수행하려고합니다. O n^2이고 읽기가 어렵습니까? 나는 특정 일치하는 항목이 발견 될 때까지 만 값을 사용하려면 키를 비교하기 위해, 사전에 (key, value)쌍 집합을 반복 할 이유가 전혀 없다 엑스 코드 8.2배열에서 문자열 배열을 효율적으로 추출하는 방법 <Dictionary <String, String >>

var AllData:Array<Dictionary<String,String>> = [] 

override func viewDidLoad() { 
     super.viewDidLoad() 

    AllData = [["pic":"Alice.png","name":"Alice Smith","position":"Nurse"], 
       ["pic":"brad.png","name":"Brad Smith MD","position":"Primary Doctor"], 
       ["pic":"user.png","name":"Dr. Quam","position":"Immunologist"], 
       ["pic":"jennifer.jpg","name":"Jennifer Johnson","position":"Case Manager"], 
       ["pic":"user.png","name":"John Banks MD","position":"Cardiologist"] 
       ] 

let names = "" 

for thing in AllData { //thing is pic, name, position 

        for (key, value) in thing { 
         if(key == "name"){ 
          names.append(value) 
          //print(value) 
         } 
        } 
       } 

print(names) 
} 
+0

정적 얼티 마이저에서'AllData'를 새로운 빈 배열로 설정하는 이유는'viewDidLoad'에서 새로운 정적 데이터로 즉시 바꾸기 만하는 이유는 무엇입니까? 그냥'AllData'를 정적 데이터와 똑같이 설정하십시오. – Alexander

+0

또한 신속한 규칙은 UpperCamelCase를 사용하여 이름을 지정하는 유형에만 적용됩니다. 다른 모든 인스턴스 및 정적 변수는 lowerCamelCase 여야합니다. – Alexander

+1

"* 배열 [...]을 출력으로 얻습니다."- 당신은'name'을'String'으로 만들었으므로, 출력 할 때'String'을 얻지 못합니다. 'let names = [String]()'을 의미 했습니까? – Hamish

답변

3

에 스위프트 3을 사용하고 있습니다. 그냥 직접 사전을 첨자 :

var names = "" 
for dict in AllData { //thing is pic, name, position 
    guard let name = dict["name"] else { continue } 
    names.append(name) 
} 
print(names) 

기능적 접근 방식은 더 빠르고 훨씬 간단합니다 :

let names = AllData.flatMap{ $0["name"] }.joined(separator: "") 

또한, 당신은 키의 정적 세트로 데이터를 저장하는 Dictionary을 사용할 수 없습니다. 구조체 나 클래스를 사용하여 데이터를 캡슐화하면 훨씬 간단하고 빠르며 더 많은 형식 안전 코드를 사용할 수 있습니다. 최종 결과는 다음과 같이 보일 것입니다 :

struct Employee { 
    let pic: String 
    let name: String 
    let position: Sting //TODO: would this be better as an enum? 
} 


class MyVC: UIViewController { 
    //... 

    let employees = [ 
     Employee(
      pic: "Alice.png", 
      name: "Alice Smith", 
      position: "Nurse" 
     ), 
     Employee(
      pic: "brad.png", 
      name: "Brad Smith MD", 
      position: "Primary Doctor" 
     ), 
     Employee(
      pic: "user.png", 
      name: "Dr. Quam", 
      position: "Immunologist" 
     ), 
     Employee(
      pic: "jennifer.jpg", 
      name: "Jennifer Johnson", 
      position: "Case Manager" 
     ), 
     Employee(
      pic: "user.png", 
      name: "John Banks MD", 
      position: "Cardiologist" 
     ) 
    ] 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let names = employees.map{ $0.name }.joined(separator: "") 

     print(names) 
    } 

    //... 
} 

DICT 및 구조체 접근 방식 모두

O(employees.count)을하지만, 구조체의 접근 방식은 낮은 오버 헤드가 적은 상용구 코드를 가지고 있으며, 비 String 직원 데이터를 쉽게 거래에 당신을 허용 할 수 있습니다 .

+0

@Hamish 하나님 당신은 이것에 능숙합니다. 제 컴파일러로 고용 할 수 있습니까? – Alexander

+0

하하, 나는 그 xD에 대해 너무 게을 리다. – Hamish

+1

@Hamish 분명히 내가 게시하기 전에 내 코드를 swiftc하기에 너무 게을러서 어쩌면 나는 거기에 이겼다 : p – Alexander