[英]Swift Type Inference requires question mark or exclamation point
在閱讀了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)
}
}
如果我在下一行省略問號或解釋點,則會引發有關該類沒有初始化程序的錯誤:
var sut: ItemManager
我的問題是,類型推斷不只是說這個變量就是這種類型嗎? 如果是這樣,如果我們沒有給它一個初始值,為什么Xcode認為它是一個屬性? 其次,如果我們從不設置值,為什么為什么要強制解包推斷類型呢?
如果需要,下面是我們用作示例的對象的代碼,在此先感謝您更好地理解:
import Foundation
class ItemManager {
let toDoCount = 0
let doneCount = 0
}
那不是類型推斷。 如果聲明變量的類型,則不會發生推斷。 推理是所有關於盤算( 推斷 )出類型是什么,如果你不明確地說 。
您在使用Swift初始化程序規則時遇到了問題。 如果您聲明一個類具有此屬性:
var sut: ItemManager
然后這是非可選的,這意味着在初始化完成之前它必須具有一個值 。 您沒有這樣做,因此Swift抱怨您的初始化程序。 您可以添加一個分配值的init
方法,也可以聲明它並同時分配一個值-如下所示:
var sut: ItemManager = ItemManager()
如果您這樣聲明:
var sut: ItemManager?
然后它是可選的,這意味着如果您不分配值,則它將獲得nil的值。 您不必在初始化期間分配值,因為它已經有一個。
出於安全考慮,Swift要求所有變量始終保持一個值。 這樣可以防止出現變量值未知的情況。 但是,在編程中仍然有一些情況要表示缺少值。 一個很好的例子是執行搜索時。 希望能夠從搜索中返回一些內容,表明未找到任何值。
因此,在Swift中,類成員必須在聲明時具有一個值。默認情況下,特定類型的成員說,Int不能為nil並且不會獲得默認值。如果我們知道變量的值可能為零,那么我們將其定義為可選。
現在,您有三個選項可為類成員提供初始值:
通過在聲明時進行初始化
通過在init方法中為其提供值
通過將其定義為可選變量或未包裝可選變量,這取決於變量的使用
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.