Swift类型推断需要问号或感叹号

Cos*_*ows 1 xcode ios swift

在阅读了Apple的ARC指南之后,我正在慢慢地试图掌握保留周期但是我不清楚的是swift的类型推断需要可选的问号或在全局范围内推断变量时强制解开感叹号.类.

例如:

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我在下一行中省略了问号或解释点,则会抛出关于没有初始值设定项的类的错误:

var sut: ItemManager
Run Code Online (Sandbox Code Playgroud)

我的问题是,不是类型推断只是简单地说这个变量将是这种类型?如果是这样,如果我们没有给它一个初始值,为什么Xcode认为它是一个属性?另外,如果我们从未设置其值,为什么强制解包推断类型编译呢?

如果需要,这里是我们使用的对象的代码作为示例,并提前感谢您获得更好的掌握:

import Foundation

class ItemManager {

    let toDoCount = 0

    let doneCount = 0

}
Run Code Online (Sandbox Code Playgroud)

Tom*_*ton 5

这不是类型推断.如果声明变量的类型,则不会发生推断.如果你没有明确说明,推论就是要弄清楚(推断)一个类型是什么.

你遇到了Swift初始化程序规则的问题.如果您声明某个类具有此属性:

var sut: ItemManager
Run Code Online (Sandbox Code Playgroud)

那么这是非可选的,这意味着它必须在初始化完成时具有值.你没有这样做,所以Swift抱怨你的初始化者.您可以添加一个init分配值的方法,也可以声明它并同时分配一个值 - 这可能如下所示:

var sut: ItemManager = ItemManager()
Run Code Online (Sandbox Code Playgroud)

如果你这样声明:

var sut: ItemManager?
Run Code Online (Sandbox Code Playgroud)

然后它是可选的,这意味着如果你没有赋值,那么它的值为nil.您不必在初始化期间分配值,因为它已经有一个值.

  • 如果要分配,请不要明确说明类型.让推理完成它的工作:`var sut = ItemManager()` (2认同)