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 版本或平台编写代码。
拥有这些属性使您的编码变得轻松且简洁。这些通常可以节省大量开发时间。