简体   繁体   English

如何快速在其他类中找到类实例名称?

[英]How to find a class instance name in other class in swift?

Imagine a situation that we have two classes like these:想象一下我们有两个这样的类的情况:

class MyClass {
    func printInstanceName() {
        print(what?);
    }
}

class User {
    var firstObject: MyClass!
    var secondObject: MyClass!
}

I will instantiate an object of class User like this:我将像这样实例化 User 类的对象:

let user = User();
user.firstObject = MyClass()
user.secondObject = MyClass()

How should i implement the printInstanceName that the output of code below我应该如何实现下面代码输出的printInstanceName

user.firstObject.printInstanceName()
user.secondObject.printInstanceName()

be

firstObject
secondObject

The purpose of doing this is, i want to know from which instance of MyClass in User , printInstanceName is called!这样做的目的是,我想知道从UserMyClass哪个实例调用printInstanceName

You cant get property name from MyClass, only from User.您无法从 MyClass 获取属性名称,只能从 User 获取。

class MyClass { }

class User {
    var myObject: MyClass!
    
    func printInstanceName() {
        let mirror = Mirror(reflecting: self)
        for (label, value) in mirror.children {
            if type(of: value) == Optional<MyClass>.self {
                print(label!)
            }
        }
    }
}

let u = User()
u.printInstanceName()

Use String(describing: type(of: self)) to print the class name.使用String(describing: type(of: self))打印类名。

class MyClass {
    func printInstanceName() {
        print(String(describing: type(of: self)))
    }
}

Don't use force-unwrapped variables unnecessarily.不要不必要地使用强制解包的变量。 You can create an init(myObject:) instead.你可以创建一个init(myObject:)来代替。

class User {
    var myObject: MyClass
    
    init(myObject: MyClass) {
        self.myObject = myObject
    }
}

Create User instance like,创建User实例,如,

let user = User(myObject: MyClass())
user.myObject.printInstanceName()

You can get variable name only in this way只能通过这种方式获取变量名

class MyClass {
    func printInstanceNameIn(user: User) {
        let mirror = Mirror(reflecting: user)
        for (label, value) in mirror.children {
            if let value = value as? MyClass, value === self {
                print(label!)
            }
        }
    }
}

class User {
    var firstObject: MyClass!
    var secondObject: MyClass!
}

let u = User()
u.firstObject = MyClass()
u.secondObject = MyClass()
u.firstObject.printInstanceNameIn(user: u)

I know this is not what you're exactly looking for but it might helps:我知道这不是您正在寻找的内容,但它可能会有所帮助:

    for child in Mirror(reflecting: user).children {
    print(child.label)
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM