Swift 中的属性是什么?
通过本文,您将了解 Swift 中的属性是什么以及如何通过代码示例使用它。
Swift 属性
Swift 允许提供有关声明或类型的一些附加信息。Swift 语言中有两种类型的属性可用。
声明属性
类型属性
语法
您可以使用符号 @ 后跟属性名称来应用属性,如下所示 -
@attribute name @attribute name(attribute arguments)
说明
我们可以在声明属性中提供参数来定义声明。这些参数可以用括号和格式提供。
声明属性
您只能将声明属性应用于声明。
以下是一些声明属性 -
@available
Available 是一个声明属性,可用于指定声明所属的 Swift 语言版本、平台或 iOS 版本。换句话说,它可以帮助您根据平台或版本使代码可用或不可用。
纵观 Swift 的发展历程,我们引入了许多新增的 API,这些 API 在发行版和未来版本中均可用。但某些代码可能无法在所有平台(macOS、watchOS 等)上运行。
此属性可以使用逗号分隔的两个或多个参数来指定。参数列表以以下平台名称或语言之一开头 -
iOS,iOSApplicationExtension
macOS,macOSApplicationExtension
watchOS,watchOSApplicationExtension
tvOS,tvOSApplicationExtension
Swift
示例
if #available(iOS 15, *) {
print("此代码可在 iOS 15 及更高版本上运行。")
} else {
print("此代码仅在 iOS 14 及更低版本上运行。")
}
输出
此代码可在 iOS 15 及更高版本上运行。
您也可以在 guard 语句中使用 available 属性 -
guard #available(iOS 15, *) else {
print("此代码仅在 iOS 14 及更低版本上运行。")
return
}
print("此代码将在 iOS 15 及更高版本上运行。")
当您希望仅为特定 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() {
// 验证用户详细信息的语句
}
}
@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")
输出:(本次无警告)
全名:Penny Black
Interface Builder 使用的声明属性
Swift 提供了一些属性,帮助我们使用 IBAction、IBDesignable、IBInspectable 和 IBOutlet 声明用户界面组件。
方法声明可以使用 IBAction 和 IBSegueAction 等 Interface Builder 属性。IBOutlet 和 IBInspectable 属性可以应用于类的属性。
示例
import UIKit
class LoginController: UIViewController {
@IBOutlet var sendButton: UIButton!
@IBAction func handleSendButtonTapped(_ sender: UIButton) {
// perform send action here
}
}
类型属性
类型属性只能应用于类型。
自动闭包
示例
顾名思义,此属性会根据函数参数自动创建闭包。基本上,我们将此属性应用于函数或方法声明。自动闭包属性不接受任何参数,通常返回一个值。
func greetingMessage(_ name: @autoclosure () -> String) {
print("Good morning, \(name())")
}
greetingMessage("Rahul")
输出
Good morning, Rahul
解释
在此示例中,greetingMessage(_:) 函数接受一个返回字符串值的闭包。@autoclosure 属性表示应自动创建一个闭包来包装 name 参数。
转义
示例
我们可以在函数或方法声明中使用 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 版本或平台编写代码。
拥有这些特性可以使您的代码编写简单、简洁。这些特性通常可以节省大量的开发时间。