Swift 中 `respondsToSelector` 的等價方法是什麼?
在 Swift 中,Objective-C 方法 `respondsToSelector` 的等價方法是 `NSObject` 類的 `responds` 屬性。
要檢查一個物件是否響應某個特定的選擇器,可以使用 `responds(to:)` 方法,該方法在 `NSObjectProtocol` 中宣告。語法如下:
if objectName.responds(to: #selector(methodName)) {
// do something if the object responds to methodName
} else {
// do something else if the object doesn't respond to methodName
}
在這個語法中,`objectName` 是要檢查的物件,`methodName` 是要檢查的選擇器。如果 `objectName` 響應 `methodName`,則 `if` 程式碼塊內的程式碼將被執行。如果 `objectName` 不響應 `methodName`,則 `else` 程式碼塊內的程式碼將被執行。
為什麼需要 `@objc` 屬性?
要在 Swift 中使用 `responds(to:)` 方法,需要用 `@objc` 屬性標記包含要檢查的方法的類。此屬性告訴 Swift 編譯器將該方法暴露給 Objective-C 執行時,從而允許使用 `responds(to:)` 方法。
示例 1
`responds(to:)` 方法是在 `NSObjectProtocol` 中定義的協議方法。這意味著任何繼承自 `NSObject` 的類(大多數 Objective-C 和 Swift 類的基類)都可以使用此方法。
步驟 1 - 在此示例中,定義了一個繼承自 `NSObject` 的類 `Person`。然後建立了一個名為 `amitObject` 的 `Person` 例項。
步驟 2 - 我們想檢查 `amitObject` 是否響應 `displayDetails` 方法。為此,我們使用 `#selector` 語法為 `displayDetails` 方法建立一個選擇器,然後將此選擇器傳遞給 `amitObject` 的 `responds(to:)` 方法。
步驟 3 - 如果 `amitObject` 響應 `displayDetails`,則 `if` 程式碼塊內的程式碼將被執行,輸出為“物件 amit 響應 displayDetails 方法”。如果 `amitObject` 不響應 `displayDetails`,則 `else` 程式碼塊內的程式碼將被執行,輸出為“物件 amit 不響應 displayDetails 方法”。
以下是如何在 Swift 中使用 `responds(to:)` 的示例:
class Person: NSObject {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
@objc func displayDetails() {
print("Name: \(self.name) and age: \(self.age)")
}
}
let amitObject = Person(name: "Amit", age: 25)
if amitObject.responds(to: #selector(Person.displayDetails)) {
print("Object amit responds to the displayDetails method")
} else {
print("Object amit does not respond to the displayDetails method")
}
輸出
Object amit responds to the displayDetails method
示例 2
在此示例中,我們將建立一個名為 `Person` 的類。`Person` 類不繼承自 `NSObject` 並定義了一個方法 `displayDetails`。以下是完整的示例:
class Person {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
func displayDetails() {
print("Name: \(self.name) and age: \(self.age)")
}
}
let amit = Person(name: "Amit", age: 25)
if amit.responds(to: #selector(Person.displayDetails)) {
print("Object amit responds to displayDetails method.")
} else {
print("Object amit does not respond to displayDetails method.")
}
輸出
value of type 'Person' has no member 'responds'
示例 3
在此示例中,我們將檢查一個物件是否響應協議方法。
步驟 1 - 在此示例中,我們定義了一個名為 `PersonManager` 的協議,其中包含一個方法 `displayDetails`。我們還定義了一個名為 `Person` 的類,該類符合 `PersonManager` 並實現了 `displayDetails`。我們建立了一個名為 `amit` 的 `Person` 例項。
步驟 2 - 我們使用 `responds(to:)` 來檢查 `amit` 是否響應 `PersonManager` 中定義的 `displayDetails`。如果 `amit` 響應 `displayDetails`,我們使用 `perform(_:)` 方法來呼叫 `displayDetails`。
步驟 3 - 我們將選擇器 `#selector(PersonManager.displayDetails)` 傳遞給 `responds(to:)` 和 `perform(_:)` 而不是 `#selector(Person.displayDetails)`。這是因為我們想要檢查 `amit` 是否響應 `PersonManager` 協議中定義的 `displayDetails` 方法,而不僅僅是在 `Person` 中實現的方法。
@objc protocol PersonManager {
@objc func displayDetails()
}
class Person: NSObject, PersonManager {
var name: String
var age: Int
init(name: String, age: Int) {
self.name = name
self.age = age
}
func displayDetails() {
print("Name: \(self.name) and age: \(self.age)")
}
}
let amit = Person(name: "Amit", age: 25)
if amit.responds(to: #selector(PersonManager.displayDetails)) {
print("Object amit responds to displayDetails method")
} else {
print("Object amit does not respond to displayDetails method")
}
輸出
Object amit responds to displayDetails method
結論
在 Swift 中,我們有 `@objc` 屬性來將類、結構體、列舉、屬性、方法和其他實體暴露給 Objective-C 程式碼。
`responds(to:)` 方法用於檢查物件是否可以響應給定的選擇器,該選擇器本質上是一個方法名。
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP