Swift 中的屬性是什麼?


在本文中,您將瞭解 Swift 中的屬性是什麼以及如何使用程式碼示例來使用它。

Swift 屬性

Swift 使得能夠提供有關宣告或型別的更多資訊成為可能。我們在 Swift 語言中可以使用兩種型別的屬性。

  • 宣告屬性

  • 型別屬性

語法

您可以透過使用符號 @ 後跟屬性名稱來應用屬性,如下所示:

@attribute name
@attribute name(attribute arguments)

解釋

我們可以在宣告屬性中提供引數來定義宣告。這些引數可以以括號和格式提供。

宣告屬性

您只能將宣告屬性應用於宣告。

以下是一些宣告屬性:

@available

Available 是一個宣告屬性,可用於指定宣告所屬的 Swift 語言版本、平臺或 iOS 版本。換句話說,它可以幫助您根據平臺或版本使程式碼可用或不可用。

在 Swift 的歷史上,API 中添加了許多內容,這些內容在釋出版和未來版本中可用。某些程式碼可能無法在所有平臺(macOS、watchOS 等)上執行。

此屬性可以用逗號分隔的兩個或多個引數指定。引數列表以以下平臺名稱或語言之一開頭:

  • iOS、iOSApplicationExtension

  • macOS、macOSApplicationExtension

  • watchOS、watchOSApplicationExtension

  • tvOS、tvOSApplicationExtension

  • Swift

示例

if #available(iOS 15, *) {
   print("This code will run on iOS 15 and upper versions.")
} else {
   print("This code will only runs on iOS 14 and lower versions.")
}

輸出

This code will run on iOS 15 and upper versions.

您也可以在 guard 語句中使用 available 屬性:

guard #available(iOS 15, *) else {
   print("This code will only runs on iOS 14 and lower versions.")
   return
}
print("This code will run on iOS 15 and upper versions.")

這對於您希望僅針對特定 iOS 版本執行特定程式碼的情況很有幫助。

@UIApplicationMain

它應用於一個類,以指示應用程式委託宣告。當我們使用此屬性時,我們會通知編譯器委託類。

@PropertyWrapper

此屬性可能有助於覆蓋屬性的值。您可以在類或結構體中使用此屬性指定自定義規範。

示例

請記住,您不能將此屬性應用於區域性和全域性屬性。讓我們看看如何在 Swift 語言中使用此屬性的示例,如下所示:

import Foundation
@propertyWrapper struct UserName {
   var wrappedValue: String {
      didSet { wrappedValue = wrappedValue.lowercased() }
   }
   init(wrappedValue: String) {
      self.wrappedValue = wrappedValue.lowercased()
   }
}
struct InstagramUser {
   @UserName var firstName: String
   @UserName var lastName: String
    
   var fullUserName: String {
      "\(firstName).\(lastName)"
   }
}
let user = InstagramUser(firstName: "Alex", lastName: "Muphy")
print(user.fullUserName)

輸出

alex.muphy

解釋

在上面的示例中,我們使用 @propertyWrapper 屬性為 UserName 建立了一個屬性包裝器。在這裡,我們將給定值包裝為小寫,因為使用者名稱應為小寫。

在 InstagramUser 結構體中,我們聲明瞭一些屬性,如名和姓以及 UserName 屬性包裝器。此外,我們無需擔心有效的大小寫值,因為這是由屬性包裝器完成的。

@Objc

此屬性用於在 Swift 程式碼中表示 Objective-C 屬性和方法。我們可以將此屬性應用於類,以告訴編譯器宣告可在 Objective-C 程式碼中使用。

import Foundation
class UserValidator {
   @objc func authenticateUser() {
	   // statements to validate user details
   }
}

@discardableResult

示例

當返回值的函式或方法的結果未被使用時,Swift 編譯器通常會發出警告。

func appendLastName(_ lastName: String) -> String {
   var fullName = "Penny"
   fullName += " \(lastName)"
   print("Full name is: \(fullName)")
   return fullName
}
appendLastName("Black")

輸出

Full name is: Penny Black

您將在這裡收到警告:

Result of call to 'appendLastName' is unused

示例

以下是使用 @discardableResult 的方法,以便抑制返回該值的方法返回的未使用的值生成的警告

@discardableResult
func appendLastName(_ lastName: String) -> String {
   var fullName = "Penny"
   fullName += " \(lastName)"
   print("Full name is: \(fullName)")
   return fullName
}
appendLastName("Black")

輸出:(這次沒有警告)

Full name is: Penny Black

Interface Builder 使用的宣告屬性

Swift 為我們提供了一些屬性,以幫助我們使用 IBAction、IBDesignable、IBInspectable 和 IBOutlet 宣告使用者介面元件。

方法宣告可以使用介面構建器屬性,例如 IBAction 和 IBSegueAction。IBOutlet 和 IBInspectable 屬性可以應用於類的屬性。

示例

import UIKit
class LoginController: UIViewController {
   @IBOutlet var sendButton: UIButton!
   @IBAction func handleSendButtonTapped(_ sender: UIButton) {
      // perform send action here
   }
}

型別屬性

您只能將型別屬性應用於型別。

autoclosure

示例

顧名思義,此屬性會自動從函式引數建立閉包。基本上,我們將此屬性應用於函式或方法宣告。autoclosure 屬性不接受任何引數,通常會返回值。

func greetingMessage(_ name: @autoclosure () -> String) {
   print("Good morning, \(name())")
}
greetingMessage("Rahul")

輸出

Good morning, Rahul

解釋

在此示例中,greetingMessage(_:) 函式接受一個返回 String 值的閉包。@autoclosure 屬性表示應自動建立閉包以包裝 name 引數。

escaping

示例

我們可以在函式或方法宣告中應用 escaping 屬性。它用於告訴編譯器儲存引數以供以後使用。這意味著我們可以儲存傳遞給函式的引數。

import UIKit
class NetworkManager {
   private func sendRequest(url: URL, completion: @escaping (Data?) -> ()) {
      let task = URLSession.shared.dataTask(with: url) { data, response, error in
         completion(data)
      }
      task.resume()
   }
   func fetchSampleData(_ completion: @escaping (Data?) -> ()) {
      guard let url = URL(string: "https://jsonplaceholder.typicode.com/todos/1") else {
         completion(nil)
         return
      }
      sendRequest(url: url, completion: completion)
   }
}
let networkManager = NetworkManager()
networkManager.fetchSampleData { data in
   print("fetched data: \(data)")
}

輸出

fetched data: Optional(83 bytes)

解釋

在此示例中,fetchSampleData() 將閉包作為引數,並使用它將獲取的資料返回給呼叫方。閉包標記為 @escaping 關鍵字,因為它是在 fetchSampleData() 函式返回後呼叫的。示例函式使用 sendRequest() 從 URL 獲取一些資料,然後在傳遞給 fetchSampleData() 的閉包中處理這些資料。

結論

在程式碼中,您可以將不同的屬性應用於類、結構體、屬性等。使用屬性,您的程式碼將看起來更加簡潔和安全。因此,您可以根據 iOS 版本或平臺編寫程式碼。

擁有這些屬性使您的編碼變得輕鬆且簡潔。這些通常可以節省大量開發時間。

更新於: 2022-12-21

950 次檢視

啟動你的 職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.