美文网首页
结构体(一)

结构体(一)

作者: 小橘子成长记 | 来源:发表于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(中心)属性的类型。

    相关文章

      网友评论

          本文标题:结构体(一)

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