Swift 中的属性是什么?

swiftserver side programmingprogramming更新于 2025/10/10 12:07:17

通过本文,您将了解 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 版本或平台编写代码。

拥有这些特性可以使您的代码编写简单、简洁。这些特性通常可以节省大量的开发时间。



相关文章



关于我们 | 隐私条款 | 学习路线
返回顶部