从初始化程序返回而没有初始化所有存储的属性错误

问题描述:

import UIKit 

enum DeviceType { 
    case Phone, Tablet, Watch 
} 

enum OperatingSystemType { 
    case iOS, Android, Windows 
} 

struct OperatingSystemVersion { 
    var Major: Int 
    var Minor: Int 
    var Patch: Int 
} 

struct OperatingSystem{ 
    var type: OperatingSystemType 
    var version: OperatingSystemVersion 

} 

class Device { 
    var DeviceID: Int 
    var Type: DeviceType 
    var Operating_System: OperatingSystem 
    var UserID: Int 
    var Description: String 
    var InventoryNR: String 
    init() { 
     DeviceID = 1233 
     UserID = 2 
     Description = "took" 
     InventoryNR = "no17" 
    } 
} 

//我似乎无法通过这个。我只是想创建2个枚举,2层结构和2类从初始化程序返回而没有初始化所有存储的属性错误

  1. 设备 - 类 设备ID - 整数 类型 - 设备类型 操作系统 - OperatingSystem的 用户ID - 诠释 描述 - 字符串 库存数量 - 字符串
+3

错误说,这一切 – Kametrixom

+0

从https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html:“类和结构*必须*在实例时将所有存储的属性设置为适当的初始值的类别或结构的创建。“尝试在'init()'中初​​始化'Type'和'Operating_System'。 – WhiteViking

该错误表示您从init返回而未初始化所有存储的属性。这就是问题所在。您需要init初始化TypeOperatingSystem

init() { 
    DeviceID = 1233 
    Type = .Phone 
    Operating_System = OperatingSystem(type: .iOS, version: OperatingSystemVersion(Major: 9, Minor: 0, Patch: 2)) 
    UserID = 2 
    Description = "took" 
    InventoryNR = "no17" 
} 

在未来,请在发布前阅读的错误消息。

+0

我试图做到这一点,我得到,我不能分配给'DeviceType.Type'类型的不可变表达式 –

+0

@RoibuAdrian糟糕,我搞砸了几个名字。我修好了它。 – NobodyNada

+0

好的,现在我明白了..我很抱歉,我是编程新手 –

https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html

初始化

初始化是制备类,结构,或枚举使用的一个实例 的过程。该过程包括 为该实例上的每个存储属性设置初始值,并且 执行 在新实例准备好使用之前所需的任何其他设置或初始化。

您可以通过定义初始化程序 来实现这个初始化过程,这些特殊方法可以被调用来创建特定类型的新实例。与Objective-C初始化器不同,初始化器不返回值。他们的主要任务是确保 一个类型的新实例在第一次被使用之前被正确地初始化为 。

类类型的实例也可以实现取消初始化程序,在该类的实例被取消分配之前 执行任何自定义清理。有关取消初始化程序的更多信息,请参阅 取消初始化程序。

设置初始值存储属性

类和结构必须由时间设定所有的存储属性的一 适当的初始值,该值的类的实例或创建 结构。存储的属性不能留在 不确定状态。

您可以在 初始化中设置了存储的属性的初始值,或作为 属性定义的一部分分配默认属性值。这些操作在以下 部分中进行了介绍。

注意

当你指定一个默认值到存储的属性,或初始化中设置该 初始值,该属性的值设置 直接,无需调用任何财产观察员。

初始化器

的初始化程序调用来创建特定类型的新实例。 在其最简单的形式中,初始值设定为像一个实例方法与 没有参数,使用init关键字写入:

init() { 
    // perform some initialization here 
} 

下面的例子定义了一个名为华氏存储在 华氏温标表示的温度的新的结构。华氏结构具有一个存储特性, 温度,它的类型的双:

struct Fahrenheit { 
    var temperature: Double 
    init() { 
     temperature = 32.0 
    } 
} 
var f = Fahrenheit() 
print("The default temperature is \(f.temperature)° Fahrenheit") // prints "The default temperature is 32.0° Fahrenheit" 

的结构定义了一个初始值设定时,init,不带参数,其初始化与32.0一个 值所存储的温度(当以华氏温标表示时,水的凝固点)。

默认属性值

可以从 初始化中设置一个存储属性的初始值,如上所示。或者,指定默认属性值 作为属性声明的一部分。定义 时,通过向属性分配初始值来指定默认的 属性值。

注意

如果属性始终以相同的初始值,提供一个默认值 而不是一个初始化内设置的值。结果 的结果是相同的,但默认值更紧密地将其属性的 初始化与其声明关联。它使得初始化器更简洁,并且使您能够从其默认值推断出属性 的类型。如本章后面所述,默认值还使 更容易利用默认初始值设定项和初始值设定项继承, 。

您可以通过 写从上面的简单形式华氏结构在点 ,酒店宣布提供其温度属性的默认值:

struct Fahrenheit { 
    var temperature = 32.0 
}