[英]Swift 2: understanding AnyObject and Self
我找不到任何對我的問題的很好的解釋,所以我想直接問你。 首先,我想在這篇文章中完善我的代碼。
我的問題是協議AnyObject
和Self
類型。 我沒有在代碼中實現AnyObject
因為它用@objc
標記,並且我不希望在代碼中涉及任何Objective-C的東西(不要@objc
)。 我也找不到有關Self
類型的任何解釋。 它只是按預期工作,但Xcode不會將Self
替換為調用靜態函數的類型。
這是一些例子:
extension Int : Instance {}
Int.singleton { (customInstanceName) -> Self in 0 } // Self shall be replaced with Int
如您所見,Xcode生成一個Self而不是一個Int。 我有沒有機會解決這個問題? 我對,Self確實會返回dynamicType,並且我的實現與上面的帖子一樣好嗎? 我非常感謝您對Self
類型的任何很好的解釋。
如您在我的代碼中所見。 我正在使用自定義協議來檢查我的實例是否是類。 是否還有其他閃亮的實現可以檢查我的實例是否是類或結構類型,或者如果我想擺脫ClassInstance協議,是否必須使用AnyObject
?
感謝您的時間。
更新:
protocol Test {}
class A : Test {}
struct B : Test {}
let aClass : Test = A()
let aStruct : Test = B()
if let someClass = aClass as? AnyObject {
print(someClass) // only this will print
}
if let someStruct = aStruct as? AnyObject {
print(someStruct)
}
這將起作用,但是AnyObject
仍被標記為@objc
協議。
Self
類型只能在符合以下類型的隱式類型typealias
的協議中使用:
protocol Testable {
func test() -> Self
}
如果要遵守此協議,則必須用類型名稱替換Self
。 例如:
struct Product: Testable {
func test() -> Product {
return Product()
}
}
重要編輯:
正如DevAndArtist在評論中指出的那樣,Swift 1.2(沒有自動橋接到Objective C)中有一個工作類檢查,但Swift 2(Xcode 7 beta 3;可能是一個錯誤)中沒有:
if instance.dynamicType is AnyClass {
// instance is a class
} else {
// instance is not a class
}
您可以在下面看到Swift 2的解決方法(主要是)。
結束編輯
對於類,如果要使其簡單,則應使用AnyObject
,但也可以使用反射,這會花費更多的精力。
在下面,您可以看到一些字符串插值的反射結果(僅前幾個字符):
"\(reflect(classType))" // Swift._ClassMirror
"\(reflect(0))" // Swift._LeafMirror
"\(reflect(enumType))" // Swift._EnumMirror
"\(reflect(structure))" // Swift._StructMirror
"\(reflect([0, 4]))" // Swift._ArrayTypeMirror
"\(reflect(NSDate()))" // Foundation._NSDateMirror
"\(reflect(NSURLRelationship.Contains))" // Swift._EnumMirror
"\(reflect(Int?(2)))" // Swift._OptionalMirror
如您所見,如果未在Swift標准庫中定義枚舉,它們是一致的(不幸的是,也是可選的...)。 因此,您還可以區分結構和枚舉:
public enum Type {
case Enum, Class, Struct
}
public func getType<T>(anything: T) -> Type {
if anything is AnyObject {
return .Class
}
if "\(reflect(anything))".hasPrefix("Swift._EnumMirror") {
return .Enum
}
return .Struct
}
因此,為了獲得更好的結果,您必須付出一些努力來區分所有不同的情況。
但是,僅區分引用類型和值類型(又名類和結構/枚舉)的最簡單方法仍然是(不幸的是,僅適用於自己聲明的結構而不是內置類型,因為它們可以橋接到目標C;我正在研究它...):
if instance is AnyObject {}
// or: if instance is of type Any
if let classInstance = instance as? AnyObject {}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.