2017-05-29 60 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

相关问题