带有可选值的Swift类

时间:2014-10-04 20:40:41

标签: swift

如何执行以下操作:

我有一个快速课程

class Book {
var title: String
var author: String?

init(title: String, author: String?) {
    self.title = title
    self.author = author
}

在另一个班级我打电话给api来检索书籍清单,有时虽然作者不在场,所以

let title: String? = getBookTitle()
let author: String? = getBookAuthor()

Book = new Book(title: book, author: author)

我对自己的方法不太自信,这是正确的做法吗?因为现在我每次想要得到这本书的作者时都要使用(如果让我的话)

2 个答案:

答案 0 :(得分:2)

你有:

let title: String? = getBookTitle()
let author: String? = getBookAuthor()

可能没有必要让title成为可选项,因为您告诉我们它始终存在,但这取决于getBookTitle的定义方式。此外,如果这些方法被定义为适当地返回StringString?,那么可以推断出此处的类型,从而产生:

let title  = getBookTitle()
let author = getBookAuthor()

接下来,你有:

Book = new Book(title: book, author: author)

但是,新Book对象的实例化需要一个变量名(并且不需要new关键字),产生:

let book = Book(title: book, author: author)

(如果您要在此范围内设置此本地let变量,请使用book。如果您要在不离开此功能的情况下一次又一次地重置它,使用var。底线,尽可能使用let。)

最后,你说:

  

这是正确的方法吗?因为现在我每次想要得到这本书的作者时都要使用(if let)。

是的,为author使用可选项是合适的。并且,是的,这意味着当您想要使用if let或等效语法时,您必须打开此可选项。请注意,如果您不想要,则不必执行可选的绑定语法if let,而是可以使用if然后执行强制解包(例如, !),如果你愿意的话。但你需要以某种方式解开它。

您在技术上可以使用隐式展开的可选(!),并且每次使用它时都会自动解包。但我认为标准的可选语法使含义更加清晰(具体而言,author可能是nil)。

答案 1 :(得分:0)

我的作品:

import UIKit

class Book {

    var title: String
    var author: String?

    init(title: String, author: String?) {
        self.title = title
        self.author = author
    }
}

class ViewController: UIViewController {


    override func viewDidLoad() {
        super.viewDidLoad()

        getBookTitle()
        getBookAuthor()
        var book = Book(title: "A Tale of Two Cities", author: "Charles Dickens")

    }

    func getBookTitle() {
    }

    func getBookAuthor() {
    }

}