簡體   English   中英

Swift 2:了解AnyObject和Self

[英]Swift 2: understanding AnyObject and Self

我找不到任何對我的問題的很好的解釋,所以我想直接問你。 首先,我想在這篇文章中完善我的代碼。

我的問題是協議AnyObjectSelf類型。 我沒有在代碼中實現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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM