Swift - 巢狀型別



巢狀型別是 Swift 程式設計中一個非常強大的工具。使用巢狀型別,我們可以輕鬆地將列舉、類和結構體巢狀到其他列舉、類和結構體中。使用巢狀型別,我們可以將列舉或類巢狀到結構體中,反之亦然。所以我們可以說,使用巢狀型別可以建立複雜的自定義型別。

巢狀型別通常用於建立組織良好且分層結構的程式。它們也用於封裝程式碼,以便我們更容易理解。它們還可以減少名稱空間衝突。

建立巢狀型別

我們可以透過將一個結構體定義到另一個結構體中,或者將一個類定義到另一個類中來建立巢狀型別,就像巢狀函式一樣。我們可以在另一個結構體、類和列舉中建立多個結構體、類和列舉。

語法

以下是巢狀型別的語法:

Struct Name{
   Struct name{
      // body
   }
}

使用此語法,我們可以巢狀類和列舉。

示例

假設我們正在建立一個汽車的結構體,其中包含多種型別的特性,例如顏色和天窗。因此,使用巢狀型別,我們可以定義每種型別的規格。

struct Car{
   struct Color{
      var single: String
      var double: String
      var customize: String
   }
   struct Sunroof{
      var half: String
      var full: String
   }
}

建立巢狀型別的例項

我們可以使用點運算子建立巢狀型別的例項。只需在外部型別的名稱前加上點運算子,然後指定巢狀型別的名稱即可。每個巢狀型別都有其例項。

語法

以下是建立巢狀型別例項的語法:

let name = outerTypeName.nestedTypeName(value: type)

或者:

var name = OuterTypeName(label1:Value, lable2: 
OuterTypeName.NestedTypeName(label: Value, lable2: Value))

示例

讓我們建立上述巢狀型別的例項:

let instance1 = Car.Color(single: "Yellow", double: "Green Black", customize: "Blue")
let instance2 = Car.Sunroof(half: "yes", full: "No")

或者:

var myCar = Car(name:"Breeza", color: Car.Color(
single: "Blue", double: "No", customize: "White"), 
sunroof:Car.Sunroof(half: "Yes", full: "No"))

完整的示例如下:

import Foundation

// Outer sturtcure
struct Car{

   // Nested structure 1
   struct Color{
      var single: String
      var double: String
      var customize: String
   }
   // Nested structure 1
   struct Sunroof{
      var half: String
      var full: String
   }
    
   // Properties
   var name: String
   var color: Color
   var sunroof:Sunroof
}

// Creating instance of Car structure
var myCar = Car(name:"Breeza", color: Car.Color(single: "Blue", double: "No", customize: "White"), sunroof:Car.Sunroof(half: "Yes", full: "No"))

// Displaying Data
print("Car name:", myCar.name)
print("Car Color:", myCar.color.single)
print("Have half Sunroof:", myCar.sunroof.half)

輸出

它將產生以下輸出:

Car name: Breeza
Car Color: Blue
Have half Sunroof: Yes

結構體內的列舉

使用巢狀型別,您不必只將結構體巢狀到另一個結構體中。我們還可以將列舉巢狀到另一個結構體中,反之亦然。

示例

將列舉巢狀到結構體中的 Swift 程式。

import Foundation

// Outer structure
struct Tutorialspoint {

   // Nested enum
   enum Department {
      case HR
      case Development
      case Designing
      case ContentWriting
   }
    
   // Properties
   var name: String
   var location: String
   var department: Department
    
   init(name: String, location: String, department: Department) {
      self.name = name
      self.location = location
      self.department = department
   }
    
   // Method
   func employeeDetail() {
      print("Name: \(name)")
      print("Location: \(location)")
      print("Department: \(department)")
   }
}

let report = Tutorialspoint(name: "Mona", location: "Hyderabad", department: .Designing)
report.employeeDetail()

輸出

它將產生以下輸出:

Name: Mona	
Location: Hyderabad
Department: Designing

類內的結構體

使用巢狀型別,我們可以將結構體巢狀到類中,或者將類巢狀到結構體中,而不會出現任何錯誤。

示例

將結構體巢狀到另一個類中的 Swift 程式。

import Foundation

// Outer class
class XYZCollege {

   // Nested structure
   struct StudentDetail {
      var name: String
      var age: Int
      var subject: String
      var year: Int
   }
    
   // Properties
   var department: String
   var details: [StudentDetail]
    
   init(department: String) {
      self.department = department
      self.details = []
   }
    
   // Method 1
   func newStudents(student: StudentDetail) {
      details.append(student)
   }
    
   // Method 2
   func studentsData() {
      print("department name: \(department):")
      for s in details {
         print("name: \(s.name), age: \(s.age), subject: \(s.subject), year: \(s.year)")
      }
   }
}

// Creating instances
let s = XYZCollege(department: "Science")
let stud1Detail = XYZCollege.StudentDetail(name: "Mona", age: 19, subject: "Maths", year: 1)
let stud2Detail = XYZCollege.StudentDetail(name: "Pihu", age: 18, subject: "Chemistry", year: 1)
let stud3Detail = XYZCollege.StudentDetail(name: "Suman", age: 19, subject: "Maths", year: 1)

// Accessing the methods
s.newStudents(student: stud1Detail)
s.newStudents(student: stud2Detail)
s.newStudents(student: stud3Detail)

s.studentsData()

輸出

它將產生以下輸出:

department name: Science:
name: Mona, age: 19, subject: Maths, year: 1
name: Pihu, age: 18, subject: Chemistry, year: 1
name: Suman, age: 19, subject: Maths, year: 1
廣告