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 版本或平臺編寫程式碼。
擁有這些屬性使您的編碼變得輕鬆且簡潔。這些通常可以節省大量開發時間。
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP