簡體   English   中英

如何在Swift中獲取變量“ Any?”的實型

[英]How can I get a “Any?” variable's real type in Swift

我從Mirror.children獲取屬性列表,它返回(標簽:String ?,值:Any)。 我如何獲取每個值的實型。

var a: Int = 1
var b: Int? = nil
var c: Any?

c = a
getType(c) -> "Int"

c = b
getType(c) -> "Optional<Int>"

您可以看一下c.dynamicType

元類型類型

元類型類型是指任何類型的類型,包括類類型,結構類型,枚舉類型和協議類型。

類,結構或枚舉類型的元類型是該類型的名稱,后跟.Type。 協議類型的元類型(不是在運行時符合協議的具體類型)是該協議的名稱,后跟.Protocol。 例如,類類型SomeClass的元類型是SomeClass.Type,協議SomeProtocol的元類型是SomeProtocol.Protocol。

您可以使用后綴自我表達式來訪問類型作為值。 例如,SomeClass.self返回自身的SomeClass,而不是SomeClass的實例。 而且SomeProtocol.self返回自身的SomeProtocol,而不是在運行時符合SomeProtocol的類型的實例。 可以將dynamicType表達式與類型的實例一起使用,以訪問該實例的動態運行時類型作為值,如以下示例所示:

class SomeBaseClass {
    class func printClassName() {
        print("SomeBaseClass")
    }
}
class SomeSubClass: SomeBaseClass {
    override class func printClassName() {
        print("SomeSubClass")
    }
}
let someInstance: SomeBaseClass = SomeSubClass()
// The compile-time type of someInstance is SomeBaseClass,
// and the runtime type of someInstance is SomeBaseClass
someInstance.dynamicType.printClassName()
// prints "SomeSubClass

使用標識運算符(===和!==)來測試實例的運行時類型是否與其編譯時類型相同。

if someInstance.dynamicType === someInstance.self {
    print("The dynamic type of someInstance is SomeBaseCass")
} else {
    print("The dynamic type of someInstance isn't SomeBaseClass")
}
// prints "The dynamic type of someInstance isn't SomeBaseClass"

使用初始化程序表達式根據該類型的元類型值構造該類型的實例。 對於類實例,被調用的初始化器必須標記為required關鍵字,或者整個類標記為final關鍵字。

class AnotherSubClass: SomeBaseClass {
    let string: String
    required init(string: String) {
        self.string = string
    }
    override class func printClassName() {
        print("AnotherSubClass")
    }
}
let metatype: AnotherSubClass.Type = AnotherSubClass.self
let anotherInstance = metatype.init(string: "some string")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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