2014-10-04 63 views
0

我怎樣才能做到以下幾點:斯威夫特類具有一個可選值

我已經在迅速

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) 

我對自己的方法不是很有自信,這是正確的做法嗎?因爲現在我必須使用(如果讓)我每次想要得到這本書我

+0

在你的數據,將一本書總是有一個標題?它會一直有作者嗎? – Undo 2014-10-04 20:47:14

+0

如果你只需要一個類型來存儲數據並閱讀一些信息,可以考慮使用'struct'而不是'class'。您可以在這裏閱讀更多關於它的信息:[類和結構](https:// developer。apple.com/library/prerelease/mac/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html) – 2014-10-04 20:52:25

+0

我給出了一個簡單的例子,因爲我懷疑使用optionals – nevermind 2014-10-04 20:57:36

回答

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)。

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() { 
    } 

}