問題不在於您發佈的代碼,而是與internetSearch
。
但是在我解釋那裏發生了什麼之前,只是簡單介紹一下Swift結構。結構帶有一個免費的初始化程序,該初始化程序將結構中定義的每個存儲屬性的參數作爲參數。參數標籤對應於變量標籤。
所以對你的結構bookData
(這確實應該是BookData
因爲類型應該是大寫),您不需要包括初始化你寫的,因爲它會爲你自動提供,只要你不產生任何額外BookData
初始化。
現在你的結果不是你所期望的。您的String
s不會作爲nil
返回。相反,他們回到空的String
s或「」。在Swift中,「」與nil
非常不同,這意味着完全沒有價值。所以你的String
確實在那裏,它們只是空的。
好的,我們的String
已經空了。我們的形象如何?不,我們的形象也不會回來。您認爲這是因爲您看到控制檯中印有UIImage
參考文獻,但如果您仔細觀察,您會發現它是一張虛假圖像。請注意實例的內存地址後面的「{0,0}」。據我所知,這意味着圖像的大小爲0 x 0.您知道多少有用圖像的大小爲0 x 0?
所以,現在我們發現我們的String
已經空了,實際上我們的形象也是如此。這裏發生了什麼?
那麼,在你的實現internetSearch
我在GitHub上找到,這是第一件事情,你做的事:
var bookTitle = String()
var bookAuthor = String()
var bookCover = UIImage()
當然,你這樣做,讓你有準備撲通的正確類型的一些變量一些實際的結果,如果你找到他們。爲了好玩,讓我們來看看如果沒有結果,上面代碼的結果會是什麼。
那麼,initializer for String
that accepts no parameters會產生一個空的String
被創建。
好吧,我們的形象如何。雖然UIImage
文件甚至沒有提及的初始化不帶參數,它也繼承了一個從NSObject
和事實證明,它只是創建一個空的圖像對象。
所以我們現在已經發現了什麼internetSearch
正在恢復實際上是一樣的,如果沒有結果會是怎樣。假設你正在尋找你知道存在的東西,那麼搜索邏輯肯定有問題,對吧?不必要。我注意到,您的internetSearch
其餘的實現依賴於你使用像這樣的NSURLSession
:
var bookTitle = String()
var bookAuthor = String()
var bookCover = UIImage()
let session = NSURLSession.sharedSession()
let task = session.dataTaskWithURL(url) { (data, response, error) -> Void in
// Lots of code that eventually sets the three variables above to a found result
}
task.resume()
return (bookTitle, bookAuthor, bookCover)
這似乎好得很,除了那NSURLSession
異步執行任務的事實!是的,在某些情況下,你甚至可以發回主隊列來執行一些任務,但是閉包作爲一個整體是異步的。這意味着,只要您撥打task.resume()
,NSURLSession
執行自己的線程/隊列/網絡上的任務,只要是任務設置它在完成前返回方式。所以task.resume()
幾乎立即返回,在任務中的任何搜索代碼實際運行之前,特別是在它完成之前。
然後,運行時進入到下一行並返回這些三個變量,就像你告訴它。這當然是問題所在,因爲internetSearch
函數在task
有機會異步運行並將它們設置爲有用值之前正在返回那些初始空變量。
建議一個功能齊全的解決方案可能超出了這個已經很長的答案的範圍,但它需要對實現細節進行大的更改,並且應該搜索使用由NSURLSession
返回的數據。
沒有我發佈任何代碼的一種可能的解決方案是讓你的internetSearch
函數不返回任何東西,但是在任務調用完成後調用一個函數,然後將結果附加到數組並打印出來,就像顯示。請研究這個概念。
另外,我建議改變你的internetSearch
實施進一步通過聲明的初始值不爲:
var bookTitle = String()
var bookAuthor = String()
var bookCover = UIImage()
...但是:
var bookTitle: String?
var bookAuthor: String?
var bookCover: UIImage?
這樣一來,如果你找到比你的結果可以表示它包裹在一個Optional
和如果沒有可以表示爲nil
,這將自動變量的默認值中的代碼的正上方。
在'internetSearch'功能,你實際上是預成型http請求? –
不,我不這麼認爲..我用NSURL會話,然後與網址的數據任務..甚至認爲我已經檢查,值確實是在搜索後返回的功能,所以它不是連接或請求.. –