問題は投稿したコードではなく、internetSearch
です。
しかし、私はそこで何が起こっているのか説明する前に、スウィフトの構造について簡単にメモします。構造体には、構造体に定義された格納された各プロパティーの1つの値をパラメーターとして持つ1つのフリー初期化子が付属しています。引数ラベルは変数ラベルに対応します。
それが自動的に限り、あなたは任意の追加を作成しないよう、あなたのために提供されますので、だから、(種類は大文字にする必要がありますので、本当にBookData
でなければなりません)あなたの構造体bookData
のために、あなたが書いた初期化子を含める必要はありませんBookData
初期化子。
あなたの結果は期待通りではありません。 String
さんはnil
に戻っていません。代わりに、空の "String
"または ""として戻ってきます。 Swiftでは、 ""はnil
とはまったく異なります。これは値が完全に存在しないことを意味します。だからあなたのString
は本当にそこにあります、彼らはただ空です。
いいえ、私たちのString
が空に戻ってきています。私たちのイメージはいかがですか?いいえ、私たちのイメージは戻っていません。あなたはUIImage
の参照がコンソールに表示されているのを見たことがあったと思っていましたが、もっと見ると偽の画像になります。インスタンスのメモリーアドレスの後ろに "{0、0}"があることを確認してください。私が知っている限り、これはイメージのサイズが0 x 0であることを意味します。サイズ0 x 0を持つ有用なイメージの数はいくつですか?
これで、私たちのString
が空に戻ってきて、効果的に私たちのイメージになっていることがわかりました。ここで何が起こっているのですか?
まあ、私はGitHubの上で見つかったinternetSearch
の実装では、これは最初の事あなたが実行します。当然のことながら
var bookTitle = String()
var bookAuthor = String()
var bookCover = UIImage()
あなたがウンチする準備ができて、正しいタイプのいくつかの変数を持っているように、あなたはこれを行いますあなたがそれらを見つけるならば、いくつかの実際の結果。ちょうど楽しみのために、結果がなければ上記のコードの結果がどうなるか見てみましょう。
まあ、initializer for String
that accepts no parametersは、空のString
が作成されます。
さて、私たちのイメージはどうですか?UIImage
のドキュメントでは、パラメータを取らないイニシャライザについては言及していませんが、NSObject
から継承し、空のイメージオブジェクトを作成することになります。
これで、internetSearch
が返すものは実際には結果がない場合の結果と同じであることがわかりました。あなたが知っているものを探していると仮定すると、検索ロジックに問題があるでしょうか?必ずしも。
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
は非同期でそのタスクを実行しているという事実を除いて、罰金とダンディ思わ:私はinternetSearch
の残りの部分の実装は、あなたがそうのように使用NSURLSession
に依存していることに気づきました!はい、部分的には、メインのキューに戻っていくつかのタスクを実行することさえできますが、クロージャ全体が非同期です。これは、task.resume()
と呼ばれるとすぐに、NSURLSession
がそのタスクを独自のスレッド/キュー/ネットワーク上で実行し、そのタスクが設定されるとすぐに完了前に戻ってくることを意味します。したがって、task.resume()
は、タスク内の検索コードが実際に実行される前、特に完了する前にすぐに戻ります。
ランタイムは次に、次の行に移動し、指示したとおりに、これら3つの変数を返します。 task
が非同期に実行して有用な値に設定する前に、internetSearch
関数が最初の空の変数を返すので、これはもちろん問題です。
完全に機能するソリューションを提案することはおそらくこの長い答えの範囲を超えていますが、実装の詳細を大幅に変更する必要があります。NSURLSession
によって返されたデータを検索する必要があります。
コードを投稿しないで、可能な解決策の1つは、internetSearch
関数が何も返さないようにすることですが、タスクコールの完了時に、結果を配列に追加して表示する関数を表示します。この概念を研究してください。あなたはあなたよりも結果を見つけた場合、この方法で
var bookTitle: String?
var bookAuthor: String?
var bookCover: UIImage?
:
var bookTitle = String()
var bookAuthor = String()
var bookCover = UIImage()
...しかしとして:
はまた、私がいないと、あなたの初期値を宣言することにより、さらにinternetSearch
の実装を変更することをお勧めしますOptional
にラップされていますが、そうでない場合は、nil
として表すことができます。これは自動的に直上のコードの変数のデフォルト値になります。
あなたの 'internetSearch'機能では、実際にhttpリクエストを実行していますか? –
いいえ私はそうは思いません..私はNSURLセッションを使用し、次にURLを使ってデータタスクを使用しました..でも私はすでにチェックしていて、値は実際には検索後の関数によって返されます。 –