Swift结构

时间:2020-02-23 14:44:04  来源:igfitidea点击:

在本教程中,我们将讨论Swift中的一个重要构建模块,即Structures。
Swift struct关键字用于在Swift编程中创建结构。

Swift结构

在较高的层次上,结构是自定义数据类型,可让我们以属性和函数的形式存储数据。
结构的亮点之一是它们是值类型而不是引用类型。
让我们看一下struct的基本语法。

struct Name {
//properties here
}

使用关键字" struct"定义结构,后跟名称和花括号。

属性是在struct中定义的普通变量/常量。
我们将在以后的教程中深入研究"属性"。

与其他语言不同,Swift中的Struct具有完整功能。
它们允许属性,函数,初始化程序,协议等。
与类不同,Swift中的结构不支持继承。

Swift结构示例

这是带有属性的Struct定义的示例。

struct Rectangle {
  var width = 0
  var height = 0
}

上面的" struct"的一个实例可以通过以下方式创建。

var rectangle = Rectangle()

要访问或者修改结构的属性,我们在实例上使用点运算符,如下所示。

print(rectangle.width) //prints 0
print(rectangle.height) //prints 0

rectangle.width = 10
rectangle.height = 10

如果实例初始化为let,则无法更改属性。

let rectangle = Rectangle()

rectangle.width = 10 //compile-time error
rectangle.height = 10 //compile-time error

在结构内部定义功能

struct Rectangle {
  var width = 0
  var height = 0
  
  func area(width :Int, height: Int) -> String
  {
       return "Area is  \(width*height)"
  }
  
}

使用结构实例调用函数,如下所示:

var rectangle = Rectangle()

rectangle.width = 10
rectangle.height = 10

rectangle.area(width: rectangle.width, height: rectangle.height) //prints 100

在函数内部修改结构属性

要在函数内部修改属性,我们需要使用关键字mutating标记该函数。

struct Rectangle {
  var width = 0
  var height = 0
  
  mutating func printModifiedWidth() -> String
  {
   
      width = width*2
      return "Modified width is \(width)"
  }
  
}

var rectangle = Rectangle()
rectangle.width = 10
rectangle.printModifiedWidth() //prints "Modified width is 20"

注意:结构内的属性无法在简单函数内更改。
将函数声明为struct内部的变量使我们能够更改Structures中的属性。

Swift结构初始化器

默认的初始化程序有2种形式。
一个空的initializer()或者一个成员初始化器,它在其括号内列出该结构的属性,以便您可以为其分配新的值。

上述结构的成员初始化器如下所示:

var rectangle = Rectangle(width: 10, height: 10)

可以将自定义初始化程序定义如下:

struct Rectangle {
  var width = 0
  var height = 0
  
  init(width: Int, height: Int) {
      self.width = width*2
      self.height = height*2
  }
}

var rectangle = Rectangle(width: 10, height: 10)
print(rectangle.width) //prints 20
print(rectangle.height) //prints 20

初始化程序委派也可以如下所示。

struct Rectangle {
  var width = 0
  var height = 0
  
  init(width: Int, height: Int) {
      self.width = width
      self.height = height
  }
  
  init(width: Int) {
  self.init(width: width, height: width)
  }
}

var square = Rectangle(width: 10)
print(square.width) //prints 10
print(square.height) //prints 10

Swift结构静态函数

可以在不创建Structure实例的情况下调用静态函数,如下所示:

struct Rectangle {
  var width = 0
  var height = 0
  
  static func printString() -> String
  {

  return "Hello how you're doing"
  }
}

Rectangle.printString() //prints "Hello how you're doing"

Swift Struct计算属性

可以使用以下语法动态计算属性。

struct Rectangle {
  var width = 0
  var height = 0
  
  var area: Int {
      get {
          return width*height
      }
      set {
          area = 0
      }
  }
  
}

set用来给属性赋一个初始值。
get是实际返回计算属性的函数。
使用计算出的属性,当" width"或者" height"被更改时," area"属性将被自动计算。

var rectangle = Rectangle()
print(rectangle.area) //prints 0
rectangle.width = 20
rectangle.height = 20
print(rectangle.area) //prints 400

Swift结构是通过值而不是通过引用传递的

struct Rectangle {
  var width = 0
  var height = 0
  
  var area: Int {
      get {
          return width*height
      }
      set {
          area = 0
      }
  }
  
}

var rectangle = Rectangle()

print(rectangle.area)
rectangle.width = 20
rectangle.height = 20

var rect = rectangle
rect.width = 30
print(rectangle.width) //prints 20 and NOT 30