Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Swift类型推理需要问号或感叹号_Ios_Swift_Xcode - Fatal编程技术网

Ios Swift类型推理需要问号或感叹号

Ios Swift类型推理需要问号或感叹号,ios,swift,xcode,Ios,Swift,Xcode,在阅读了Apple的ARC指南之后,我慢慢地试图掌握retain cycles,但我不清楚的是,swift的类型推断在推断类的全局范围内的变量时需要可选的问号或强制展开感叹号 例如: import XCTest @testable import PassionProject class ItemManagerTests: XCTestCase { var sut: ItemManager! override func setUp() { super.setU

在阅读了Apple的ARC指南之后,我慢慢地试图掌握retain cycles,但我不清楚的是,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)
    }
}
如果我在下一行中省略了问号或解释点,它会抛出一个关于类没有初始值设定项的错误:

var sut: ItemManager
我的问题是,类型推断不只是简单地说这个变量将属于这种类型吗?如果是这样的话,如果我们没有给它一个初始值,为什么Xcode会认为它是一个属性呢?第二,如果我们从未设置推断类型的值,为什么强制展开它会编译

如果需要,以下是我们正在使用的对象的代码作为示例,并提前感谢您更好地理解:

import Foundation

class ItemManager {

    let toDoCount = 0

    let doneCount = 0

}

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

您对Swift初始值设定规则有问题。如果声明类具有此属性:

var sut: ItemManager
这是非可选的,这意味着在初始化完成时必须有一个值。你没有这么做,所以斯威夫特在抱怨你的初始化者。您可以添加一个分配值的
init
方法,也可以声明它并同时分配一个值——可能如下所示:

var sut: ItemManager = ItemManager()
var sut: ItemManager?
如果您这样声明:

var sut: ItemManager = ItemManager()
var sut: ItemManager?

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

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

您对Swift初始值设定规则有问题。如果声明类具有此属性:

var sut: ItemManager
这是非可选的,这意味着在初始化完成时必须有一个值。你没有这么做,所以斯威夫特在抱怨你的初始化者。您可以添加一个分配值的
init
方法,也可以声明它并同时分配一个值——可能如下所示:

var sut: ItemManager = ItemManager()
var sut: ItemManager?
如果您这样声明:

var sut: ItemManager = ItemManager()
var sut: ItemManager?

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

出于安全原因,Swift要求所有变量始终保持一个值。这可以防止出现变量值未知的情况。然而,在编程中仍有一些情况需要表示缺少值。执行搜索时就是一个很好的例子。人们希望能够从搜索中返回一些指示未找到任何值的内容

因此,在Swift中,类成员在声明时必须有一个值。默认情况下,特定类型的成员(例如Int)不能为nil,并且不会获得默认值。如果我们知道变量的值可能为nil,则将其定义为可选值

现在有三个选项可为类成员提供初始值:

  • 在声明时草签

  • 通过在init方法中为其提供一个值

  • 通过将其定义为可选或未包装可选,这取决于变量的使用


  • 出于安全原因,Swift要求所有变量始终保持一个值。这可以防止出现变量值未知的情况。然而,在编程中仍有一些情况需要表示缺少值。执行搜索时就是一个很好的例子。人们希望能够从搜索中返回一些指示未找到任何值的内容

    因此,在Swift中,类成员在声明时必须有一个值。默认情况下,特定类型的成员(例如Int)不能为nil,并且不会获得默认值。如果我们知道变量的值可能为nil,则将其定义为可选值

    现在有三个选项可为类成员提供初始值:

  • 在声明时草签

  • 通过在init方法中为其提供一个值

  • 通过将其定义为可选或未包装可选,这取决于变量的使用


  • 如果要赋值,请不要显式声明类型。只需让推理完成它的工作:
    var sut=ItemManager()
    如果要赋值,请不要显式地声明类型。只需让推理完成它的工作:
    var sut=ItemManager()