在Swift中使用AnyObject遇到的問題:方法回調(diào)的參數(shù)類型不確定,設置接收AnyObject,傳參數(shù)的時候,傳入String類型,會導致編譯報錯!
Any、AnyObject
Swift為不確定類型提供了兩種特殊類型:
Any can represent an instance of any type at all, including function types.
AnyObject can represent an instance of any class type.
Any:代表任意類型實例,包括方法類型。
AnyObject:代表任意'類(class)'類型的實例。
- AnyObject
AnyObject在API中的聲明:
@objc public protocol AnyObject {
}
并且在官方注釋為:
/// The protocol to which all classes implicitly conform.
可見AnyObject為一個空協(xié)議,并且默認所有Class均隱式遵循此協(xié)議!
- Any
Any:天下我最大,可以代表任意類型的實例。
官方文檔給出了一個例子:
var things = [Any]()
things.append(0)
things.append(0.0)
things.append(42)
things.append(3.14159)
things.append("hello")
things.append((3.0, 5.0))
things.append({ (name: String) -> String in "Hello, \(name)" })
Any類型的數(shù)組中包含了各種類型的數(shù)據(jù),包括非Class類型的String類型,在Swfit中的String為結(jié)構(gòu)體類型。
Any是可以代表函數(shù)類型的,舉個栗子:
class ViewController: UIViewController {
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
sayWhat(str: sayHello())
}
func sayWhat(str : Any){
print("i say \(str)")
}
func sayHello() -> String{
return "hello world!"
}
}
結(jié)果輸出:i say hello world!
- AnyClass
AnyClass在API中的聲明:
public typealias AnyClass = AnyObject.Type
并且官方文檔的注釋為:
/// The protocol to which all classes implicitly conform.
AnyClass僅為AnyObject.Type的別名!通過 AnyObject.Type 這種方式所得到是一個元類型 (Meta)。
詳情參閱喵神的文章:
傳送門:http://swifter.tips/self-anyclass/
Zeb