设为首页 加入收藏

TOP

【Swift学习】Swift编程之旅---构造方法(十八)(五)
2017-10-13 10:29:18 】 浏览:6514
Tags:Swift 学习 编程 之旅 --- 构造 方法 十八
it(name: String)并给参数name传值[Unnamed]来实现:
let mysteryMeat = Food() // mysteryMeat 的名字是 [Unnamed] 

 

类层级中的第二个类是Food的子类RecipeIngredient。RecipeIngredient类构建了食谱中的一味调味剂。它引入了Int类型的数量属性quantity(以及从Food继承过来的name属性),并且定义了两个构造器来创建RecipeIngredient实例
class RecipeIngredient: Food { var quantity: Int init(name: String, quantity: Int) { self.quantity = quantity super.init(name: name) } convenience init(name: String) { self.init(name: name, quantity: 1) } } 

 

下图中展示了RecipeIngredient类的构造器链:
RecipeIngredient类拥有一个指定构造器init(name: String, quantity: Int),它可以用来产生新RecipeIngredient实例的所有属性值。这个构造器一开始先将传入的quantity参数赋值给quantity属性,这个属性也是唯一在RecipeIngredient中新引入的属性。随后,构造器将任务向上代理给父类Food的init(name: String)。这个过程满足两段式构造过程中的安全检查1。
 
RecipeIngredient也定义了一个便利构造器init(name: String),它只通过name来创建RecipeIngredient的实例。这个便利构造器假设任意RecipeIngredient实例的quantity为1,所以不需要显示指明数量即可创建出实例。这个便利构造器的定义可以让创建实例更加方便和快捷,并且避免了使用重复的代码来创建多个quantity为 1 的RecipeIngredient实例。这个便利构造器只是简单的将任务代理给了同一类里提供的指定构造器。
 
注意,RecipeIngredient的便利构造器init(name: String)使用了跟Food中指定构造器init(name: String)相同的参数。尽管RecipeIngredient这个构造器是便利构造器,RecipeIngredient依然提供了对所有父类指定构造器的实现。因此,RecipeIngredient也能自动继承了所有父类的便利构造器。
 
在这个例子中,RecipeIngredient的父类是Food,它有一个便利构造器init()。这个构造器因此也被RecipeIngredient继承。这个继承的init()函数版本跟Food提供的版本是一样的,除了它是将任务代理给RecipeIngredient版本的init(name: String)而不是Food提供的版本。
 
所有的这三种构造器都可以用来创建新的RecipeIngredient实例:
let oneMysteryItem = RecipeIngredient() let oneBacon = RecipeIngredient(name: "Bacon") let sixEggs = RecipeIngredient(name: "Eggs", quantity: 6) 

 

类层级中第三个也是最后一个类是RecipeIngredient的子类,叫做ShoppingListItem。这个类构建了购物单中出现的某一种调味料。
 
购物单中的每一项总是从unpurchased未购买状态开始的。为了展现这一事实,ShoppingListItem引入了一个布尔类型的属性purchased,它的默认值是false。ShoppingListItem还添加了一个计算型属性description,它提供了关于ShoppingListItem实例的一些文字描述
class ShoppingListItem: RecipeIngredient { var purchased = false 
    var description: String { var output = "\(quantity) x \(name.lowercaseString)" output += purchased ? " ?" : " ?" 
        return output } } 

 

注意:ShoppingListItem没有定义构造器来为purchased提供初始化值,这是因为任何添加到购物单的项的初始状态总是未购买。
 
由于它为自己引入的所有属性都提供了默认值,并且自己没有定义任何构造器,ShoppingListItem将自动继承所有父类中的指定构造器和便利构造器。
 
下图种展示了所有三个类的构造器链:
你可以使用全部三个继承来的构造器来创建ShoppingListItem的新实例:
var breakfastList = [ ShoppingListItem(), ShoppingListItem(name: "Bacon"), ShoppingListItem(name: "Eggs", quantity: 6), ] breakfastList[0].name = "Orange juice" breakfastList[0].purchased = true 
for item in breakfastList { println(item.description) } // 1 x orange juice ? // 1 x bacon ? // 6 x eggs ? 

 

如上所述,例子中通过字面量方式创建了一个新数组breakfastList,它包含了三个新的ShoppingListItem实例,因此数组的类型也能自动推导为ShoppingListItem[]。在数组创建完之后,数组中第一个ShoppingListItem实例的名字从[Unnamed]修改为Orange juice,并标记为已购买。接下来通过遍历数组每个元素并打印它们的描述值,展示了所有项当前的默认状态都已按照预期完成了赋值。
 
  Failable Initializers
通过构造器初始化实际上是给class或struct,枚举的每一个存储属性(参数)提供初始值,进行对象实例化的过程。在一些情况下,初始化的过程可能会因为参数错误是有可能失败的。通过init?来声明一个可失败构造器
注意:你不能定义一个与可失败构造器的参数和名称相同的不可失败构造器。
 
failable初始化创建的类型初始化一个可选值。返回nil表示初始化失败可触发的
 
 
使用可失败构造器可极大程度的统一
首页 上一页 2 3 4 5 6 下一页 尾页 5/6/6
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇swift3.0的改变 下一篇FMDB基本使用

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目