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