2017-05-29 91 views
-1

班級書是我正在努力的。目標是將檢查塊變爲true。查找具有相同標題和返回類元素的元素

我嘗試比較liste-array中每本書的標題和我正在搜索的標題。如果發現該函數應該輸出book-element,如果沒有,則返回nil。

這是我目前有:

class Book { 
    var title:String; 
    var isbn:String; 
    var price:Float; 

    public init(_ title:String, _ isbn:String, _ price:Float) { 
     self.title=title; 
     self.isbn=isbn; 
     self.price=price; 
    } 
} 

//findBookWithTitle should output the first element with the same title. 

func findBookWithTitle(_ title:String, inListe liste:[Book]) -> Book? { 
    var data=liste; 
    var stitle=title; 
    var memory:Int=0; 

    for i in 0..<data.count{ 

     if data[i].title==stitle{ 
      memory=i; 
     }else{ 
      return nil; 
     } 
    } 

    return data[memory] 
} 


//exam block 
let daten=[Book("Book A","ISBN A",12),Book("Buch B","ISBN B",14),Book("Book C","ISBN C",17)]; 
let a1a = findBookWithTitle("Book C", inListe: daten) === daten[2]; 
let a1b = findBookWithTitle("Book A", inListe: daten) === daten[0]; 
let a1c = findBookWithTitle("Testbook", inListe: daten) === nil; 
let a1 = a1a && a1b && a1c; 

我不具有任何錯誤,不知道從哪裏開始解決這個問題。

+0

這簡直就是'如果let book = liste.first(其中:{$ 0.title == title}){return book} return nil' –

+1

或者只是'return liste.first(其中:{$ 0.title = = title})':) – Hamish

+0

不相關,但請注意,您不需要用分號結束每個語句。 – Hamish

回答

1

只要在枚舉過程中遇到不匹配的書名,您的代碼就不能正常工作,因爲您只要遇到不匹配的書名,就立即使用return nil

正確的做法是爲一本書,一個匹配的標題被發現,一旦回國,並返回nil如果沒有匹配的書時 枚舉發現:

func findBookWithTitle(_ title:String, inListe liste:[Book]) -> Book? { 

    for i in 0..<liste.count { 
     if liste[i].title == title { 
      return liste[i] 
     } 
    } 
    return nil 
} 

(注意,沒有需要使所有的參數的變量的副本。)

如上面已經建議的,這可以簡化爲

func findBookWithTitle(_ title:String, inListe liste:[Book]) -> Book? { 
    return liste.first(where: { $0.title == title }) 
} 

使用first(where:)方法進行數組(或更一般地說,用於序列)。

+0

非常感謝!我簡直不敢相信:D – Jassi

相關問題