你已经学习了Swift的一些基本构建模块。有了变量、条件、字符串、函数和集合,可以征服世界了!
执行复杂任务的大多数程序都受益于较高的抽象类型。除了Int、String或Array之外,大多数程序都使用特定于当前任务域的新类型。例如,跟踪照片或联系人比你目前看到的类型要求更多。
这一章介绍结构,这是你将了解的第一个命名类型。结构是可以存储命名属性和定义自己行为的类型。与字符串、Int或数组一样,你可以定义自己的结构,以创建在代码中使用的命名类型。在本章末尾,你将知道如何定义和使用你自己的结构。
你可以用披萨开始你的冒险
想象你住在一个叫Pizzaville的小镇。正如你所料,Pizzaville以其美味的披萨而闻名。你拥有披萨店最受欢迎(而且最快!)的披萨外卖餐厅——“快披萨”。
QQ20180509-131145@2x.png
作为一家餐厅的老板,你的配送范围还是很有限的。你希望编写一个程序,计算潜在客户是否在您的配送程序范围内。程序的第一个版本可能是这样的:
let restaurantLocation = (2, 4)
let restaurantRange = 2.5
func distance(from source: (x: Int, y: Int), to target: (x: Int, y: Int))
-> Double {
let distanceX = Double(source.x - target.x)
let distanceY = Double(source.y - target.y)
return (distanceX * distanceX + distanceY * distanceY).squareRoot()
}
func isInDeliveryRange(location: (x: Int, y: Int)) -> Bool {
let deliveryDistance = distance(from: location, to: restaurantLocation)
return deliveryDistance < restaurantRange
}
很简单,对吧? distance(from:to:) 将计算你离你的披萨有多远。isInDeliveryRange(location:)将返回true,如果您不远的话。
QQ20180509-131534@2x.png一个成功的批萨外卖业务可能最终会扩展到包括多个地点,这为配送外卖的计算器添加了一个小的转折。用以下代码替换现有代码:
let restaurantLocation = (2, 4)
let restaurantRange = 2.5
let otherRestaurantLocation = (7, 8)
let otherRestaurantRange = 1.5
// Pythagorean Theorem ' (
func distance(from source: (x: Int, y: Int), to target: (x: Int, y: Int))
-> Double {
let distanceX = Double(source.x - target.x)
let distanceY = Double(source.y - target.y)
return (distanceX * distanceX + distanceY * distanceY).squareRoot()
}
func isInDeliveryRange(location: (x: Int, y: Int)) -> Bool {
let deliveryDistance = distance(from: location, to: restaurantLocation)
let secondDeliveryDistance = distance(from: location, to: otherRestaurantLocation)
return deliveryDistance < restaurantRange || secondDeliveryDistance < otherRestaurantRange
}
isInDeliveryRange(location:)检查两个地点,看看你是否能从其中一个得到你的披萨。
最终,越来越多的客户将迫使企业扩张,很快,它可能会增长到10家商店!然后呢?你是否一直更新你的功能来检查所有这些坐标和范围?
QQ20180509-134931@2x.png你的第一个结构
结构是Swift中命名的类型之一,它允许您封装相关的属性和行为。您可以声明一个新类型,给它一个名称,然后在代码中使用它
在披萨业务的例子中,您一直使用x/y坐标元组来表示位置。
作为结构的第一个例子,促进从元组到结构类型的Location:
struct Location {
let x: Int
let y: Int
}
这段代码演示了定义结构的基本语法。在本例中,该代码声明了一个名为Location的类型,它有x和y坐标。
基本语法以struct关键字开头,后面跟着类型的名称和一对花括号。大括号之间的所有内容都是struct的成员。
在Location上,两个成员x和y都是属性。属性是作为类型的一部分声明的常量或变量。类型的每个实例都具有这些属性。这意味着在我们的示例中,每个位置都具有x和y属性。
你可以实例化一个结构并将其存储在一个常量或变量中,就像你使用过的其他类型一样:
let storeLocation = Location(x: 2, y: 4)
要创建Location值,请使用类型的名称和括号中的参数列表。这个参数列表提供了一种方法来指定属性x和y的值。这是一个初始化器的例子。
初始化器强制在使用它们之前设置所有属性。这是Swift的关键安全特性之一。不小心使用未初始化的变量是其他语言中错误的主要来源。另一个方便快捷的特性是,你不需要在Location类型中声明这个初始化器。Swift自动为结构的初始化器提供参数列表中的所有属性。
以后,你将学到更多关于初始化的知识。
你可能还记得,这里还有一个范围,现在披萨业务正在扩张,不同的餐厅可能有不同的范围。您可以创建另一个结构来表示餐厅的配送区域,比如:
struct DeliveryArea {
let center: Location
var radius: Double
}
var storeArea = DeliveryArea(center: storeLocation, radius: 4)
现在有一个新的结构叫做DeliveryArea,它包含一个常数center中心属性和一个可变radius半径属性。正如你所看到的,你可以在结构值内拥有结构值(结构中有结构);这里,你使用Location类型作为DeliveryArea的center(中心)属性的类型。
网友评论