2016-07-14 65 views
0

当我设置名为item2的变量时,代码行出错了,如果name属性是可选的,为什么不能进行初始化?在Swift 3中使用默认初始化程序更改可选属性值

class ShoppingListItem { 
    var name: String? 
    var quantity = 1 
    var purchased = false 
} 

var item = ShoppingListItem() 
var item2 = ShoppingListItem(name:"Orange Juice") 

print(item.name) 
print(item2.name) 
+2

关于可选:在现实生活中有多少无名购物清单项目在那里? ;-) – vadian

回答

3

有了这个代码

ShoppingListItem(name:"Orange Juice") 

要调用的ShoppingListItem的初始化不存在。

所以只要定义初始化到类

class ShoppingListItem { 
    var name: String? 
    var quantity = 1 
    var purchased = false 

    init(name:String) { 
     self.name = name 
    } 

    init() { } 
} 
1

Memberwise Initializers for Structure Types

结构类型自动接收按成员初始化,如果他们 不定义任何自己定制的初始化方法。与默认的 初始值设定项不同,即使它存储了没有默认值的属性,结构也会收到成员初始值设定项。

成员初始值设定项是初始化新结构实例的成员 属性的简写方法。新实例的 属性的初始值可以按名称传递给成员设计的 初始值设定项。

下面的例子定义了一个名为Size的结构,它具有两个属性 ,称为宽度和高度。通过分配默认值0.0,两个属性都被推断为 Double。

规模结构自动接收一个init(宽:高:) 按成员初始化,您可以用它来初始化一个新的大小 例如:

struct Size { 
    var width = 0.0, height = 0.0 
} 

let twoByTwo = Size(width: 2.0, height: 2.0) 
+0

请添加您自己的东西到这个职位。 –

+0

每个答案都是直接来自Swift文档。即使是问题的代码在文档中。 https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/Initialization.html – Asdrubal

+2

接受的答案使用问题中的代码和海报写的解释。这也是关于结构的文档;有问题的代码使用一个类。 –

1

在你的代码必须添加初始化,或在初始化后设置一个名称:

class ShoppingListItem { 
    var name: String? 
    var quantity = 1 
    var purchased = false 
} 

var item2 = ShoppingListItem() 
item2.name = "Orange Juice" 

print(item2.name) 
+0

其实你现在正在给name分配一个空的'String'来表示没有价值。你应该总是使用'nil'来表示没有价值的概念。 –

+0

是的,你是对的,thnx – Igor

+0

有或没​​有方法与在Swift中选择'class'与'struct'无关。 – andyvn22

相关问题