美文网首页
结构体(一)

结构体(一)

作者: 小橘子成长记 | 来源:发表于2018-05-09 14:21 被阅读3次

你已经学习了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(中心)属性的类型。

相关文章

  • C结构体和链表

    一,结构体变量定义及初始化 二,无名结构体 备注:无名结构体很少使用 三,宏定义结构体 四,结构体嵌套 五,结构体...

  • 6.结构体相关

    一 C 结构体和结构体指针 eg1: 一 结构体里面定义函数 通过结构体指针访问结构体里面定义的函数。 eg2:

  • 结构体的基本操作

    结构体定义和初始化 结构体变量相互赋值 结构体数组 结构体嵌套一级指针 结构体嵌套二级指针 结构体偏移量 联合体 ...

  • 结构体

    [toc] 结构体的定义方式 先定义结构体类型,再定义结构体变量 定义结构体类型的同时定义结构体变量 定义结构体类...

  • 12-Go语言结构体

    结构体 结构体的基本概念 什么是结构体Go语言中的结构体几乎和C语言中的结构体一模一样都需要先定义结构体类型, 再...

  • 【C语言笔记】<十九>结构体

    结构体的基本概念 结构体初始化 结构体的内存存储细节 结构体定义的方式 结构体类型的作用域 指向结构体的指针 结构...

  • 结构体

    结构体定义* 结构体中的格式:* struch 结构体名* {* 结构体成员变量* }* 结构体中的特点* 1.结...

  • Go 学习笔记 08 | 结构体详解

    一、结构体 实例化结构体 第一种实例化结构体:var 变量 结构体 输出: 结构体首字母可以大写也可以小写,大写表...

  • C语言-5、结构体

    写法一 写法二 写法三 结构体指针 结构体指针 与 动态内存开辟 结构体的数组 结构体与结构体指针 取别名 取别名...

  • 结构体数组的定义

    结构体数组的定义 1、先定义结构体类型,再定义结构体数组 2、定义结构体类型的同时定义结构体数组 3、省略结构体类...

网友评论

      本文标题:结构体(一)

      本文链接:https://www.haomeiwen.com/subject/gkmnrftx.html