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 版本或平台编写代码。

拥有这些属性使您的编码变得轻松且简洁。这些通常可以节省大量开发时间。

更新于: 2022-12-21

950 次查看

启动你的 职业生涯

通过完成课程获得认证

开始学习
广告