2017-01-02 7 views
0

AppleのARCガイドを読んだ後、私はゆっくりと保持サイクルを把握しようとしていますが、私には明らかではないのは迅速なタイプ推論ではオプションの疑問符や強制アンラッピングクラスのグローバルスコープ内の変数を推測する際の感嘆符。例えばスウィフトタイプ推論には疑問符や感嘆符が必要

:私は次の行に疑問符や説明のポイントを省略した場合

import XCTest 
@testable import PassionProject 

class ItemManagerTests: XCTestCase { 

    var sut: ItemManager! 

    override func setUp() { 
     super.setUp() 
     // Put setup code here. This method is called before the invocation of each test method in the class. 

     sut = ItemManager() 
    } 

    override func tearDown() { 
     // Put teardown code here. This method is called after the invocation of each test method in the class. 
     super.tearDown() 
    } 

    func tests_ToDoCount_Is_InitiallyZero() { 

     XCTAssertEqual(sut.toDoCount, 0) 
    } 

    func tests_DoneCount_Is_InitiallyZero(){ 

     XCTAssertEqual(sut.doneCount, 0) 
    } 
} 

、それはクラスが初期化子を持っていないというエラーがスローされます。

var sut: ItemManager 

私の質問があります型推論ではなく、単にこの変数がこの型であると言っていますか?もしそうなら、Xcodeが初期値を与えていないとXcodeがそれをプロパティと考えているのはなぜですか?また、なぜ値を設定しないと、推論された型のコンパイルが強制的に行われないのですか?必要に応じて

は、ここでは一例として使用しているオブジェクトのためのコードであり、より良い理解を得るために、事前にあなたに感謝:

import Foundation 

class ItemManager { 

    let toDoCount = 0 

    let doneCount = 0 

} 

答えて

4

推論を入力していないということ。変数の型を宣言すると、推論は起こりません。あなたが明示的にと言っていない場合、どのタイプがであるかを推測すること(を推論することです)。

スウィフトイニシャライザのルールに問題があります。あなたはクラスがこのプロパティを持っていることを宣言した場合:

var sut: ItemManager 

次にそれがを意味し、非オプションです、それは時間の初期化で値を持っている必要があります完了です。あなたはそれをしていないので、Swiftはあなたのイニシャライザについて不平を言っています。あなたが値を代入initメソッドを追加するか、またはあなたはそれを宣言し、このように見えるかもしれません同じtime--に値を割り当てることができます:

var sut: ItemManager = ItemManager() 

あなたはこのようにそれを宣言する場合:

var sut: ItemManager? 

これはオプションです。つまり、値を割り当てない場合、値はnilになります。すでに初期化されているため、初期化中に値を割り当てる必要はありません。

+1

割り当てている場合は、明示的にタイプを指定しないでください。推論にその作業をさせてください: 'var sut = ItemManager()' – Alexander

1

スイフトは、安全上の理由から、すべての変数に常に値を保持する必要があります。これにより、変数の値が不明なシナリオが防止されます。しかし、価値の欠如を表現したいと思っているプログラミングの場合がまだあります。これの大きな例は、検索を実行するときです。値が見つからなかったことを示す何かを検索から戻すことができるようにしたいと考えています。

したがってSwiftでは、クラスメンバーは宣言時に値を持たなければなりません。デフォルトでは、特定の型のメンバ、例えばIntはnilにすることはできませんし、デフォルト値を取得しません。変数の値がnilの場合、オプションとして定義します。

は今、あなたはクラスのメンバへの初期値を提供するために3つのオプションがあります。initメソッドでそれに価値を提供することにより、宣言

  • の時点でそれを初期化することにより

    1. 変数の使用に依存するオプションまたはアンラップオプションとして定義することにより、