簡體   English   中英

為什么不能快速使用元類型作為結構的屬性?

[英]Why can't I use a Metatype as a property on a struct in swift?

所以我想知道當我嘗試實例化具有元類型作為屬性類型的結構而不是對類進行相同操作時,游樂場崩潰。

結構版本:

struct Dog {
    static func saySomething() {
        print("Woof")
    }
}

我創建了一個具有與元類型綁定的屬性的結構PetOwner ,並對其進行了編譯。

struct PetOwner {
    let name: String
    let pet: Dog.Type
}

當我嘗試使用它時,操場崩潰了。

// Crashes
let dogOwner = PetOwner(
    name: "Joe",
    pet: Dog.self
)

但是,當我將PetOwner為類時:

class PetOwner {
    let name: String
    let pet: Speaking.Type

    init(name: String, pet: Dog.Type) {
        self.name = name
        self.pet = pet
    }
}

然后,我可以實例化該類並調用靜態方法:

let dogOwner = PetOwner(
    name: "Joe",
    pet: Dog.self
)

dogOwner.pet.saySomething() // Woof

為什么會這樣呢? 嘗試實例化結構版本的錯誤消息非常難以理解:

錯誤:執行被中斷,原因:EXC_BAD_ACCESS(代碼= EXC_I386_GPFLT)。 該進程已被中斷,請使用“線程返回-x”返回到表達式求值之前的狀態。

但是,真正奇怪的是,如果我綁定了Metatype協議,那么它又可以與struct一起使用:

protocol Speaking {
    static func saySomething()
}

struct Dog: Speaking {
    static func saySomething() {
        print("Woof")
    }
}

struct PetOwner {
    let name: String
    let pet: Speaking.Type
}

// Works!
let dogOwner = PetOwner(
    name: "Joe",
    pet: Dog.self
)
dogOwner.pet.saySomething() // Woof

我在這里想念什么?

這是你想要的?

//: Playground - noun: a place where people can play

import UIKit

struct Dog {
    static func saySomething() {
        print("Woof")
    }
}

struct PetOwner {
    let name: String
    let pet: Dog
}

let dog = Dog()

// Won't crash
let dogOwner = PetOwner(
    name: "Joe",
    pet: dog
)

dogOwner.pet

看來您正在嘗試訪問Dog.Type(您正在調用Dog.self,而其中的Dog實際上是Dog.type ...所以您在執行Dog.type.self ...我想?)。 請注意,在結構中必須創建一個dog對象,而在類中則不需要。

暫無
暫無

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

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