gpt4 book ai didi

swift - 是否有与 C#'s ' nameof( )' function to get a variable or member' s name?

转载 作者:行者123 更新时间:2023-12-04 11:19:54 24 4
gpt4 key购买 nike

好的,这里有一个关于 S/O 的现有问题,标题如下:
Swift: Get Variable Actual Name as String
顾名思义,这似乎正是我想要的。但是,查看已接受的答案(以及其他未接受的答案),他们指的是关键路径操作,这不是我所追求的。 (即这不是重复的!)
就我而言,我希望 将一个变量 的名称存储在 中的第二个变量 类型的字符串中。
在 C# 中,使用 nameof 很简单,就像这样......

int someVar = 3

string varName = nameof(someVar)
// 'varName' now holds the string value "someVar"

Note: nameof() executes at compile-time, not run-time so no reflection or anything else is needed. The compiler simply subs in the name of the variable as if someone manually typed its name as a string constant.


例如,当您想要定义一个查询对象时,它非常方便,其中您的成员名称与 URL 中传递的查询参数相匹配。
这是一个伪代码示例(即这显然不会编译,但显示了我所追求的。另外,请不要关注这个的 URL 方面。在实际代码中,我会使用 URLComponents,而不是字符串附加像这里的 URL。):
struct queryObject{

let userName : String
let highScore : Int

var getUrl:String{
return "www.ScoreTracker.com/postScore?\(nameof(userName))=\(userName)&\(nameof(highScore))=\(highScore)"
}
}
以下是您将如何使用它以及它会返回什么:
let queryObject = QueryObject(userName:"Maverick", highScore:123456)

let urlString = queryObject.getUrl
返回值将是:
www.ScoreTracker.com/postScore?userName=Maverick&highScore=123456
访问变量的字符串表示而不是使用字符串常量的优点有很多:
  • 没有硬编码的字符串。
  • 您可以像往常一样使用符号的重构/重命名,生成的字符串会跟踪
  • 允许您保持 API 和实现同步,这有助于提高可读性。

  • 例如,假设 API 将查询参数从 userName 更改为 userId ,所有需要做的就是重构变量名称,输出将相应地更新,而无需手动触摸任何字符串。
    那么,这可以在 Swift 中完成吗?你能得到实际的变量名并将它存储在第二个变量中吗?

    最佳答案

    是的你可以。我用它作为下一个场景的解决方案:当我在控制台中打印一个对象/结构时,我喜欢看到 vars 名称以及关联的值:

    extension CustomStringConvertible {
    var description: String {
    var description = "\n ***** \(type(of: self)) *****\n"
    let mirrorS = Mirror(reflecting: self)
    for child in mirrorS.children {
    if let propertyName = child.label {
    description += " \(getSpaces(forWord: propertyName))\(propertyName): \(child.value)\n"
    }
    }

    return description
    }
    }
    为了使用它,让我们以以下结构为例:
    public struct FavoriteApp: Codable, CustomStringConvertible, Hashable {
    let appId: String
    let appName: String
    let bundleId: String
    let image: NSImage
    let isMacApp: Bool
    let rating: String
    let screenshotUrls: [String]
    let sellerName: String
    let sellerUrl: String
    let releaseDate: String
    let genres: String
    let latestVersion: String

    }

    let anApp:FavoriteApp = getTheAppInfoFromServer()
    print(anApp)

    // This will print into console:
    // ***** FavoriteApp *****
    // appId: 1438547269
    // appName: Dynamic wallpaper
    // bundleId: com.minglebit.DynamicWallpaper
    // image: -not visible- (but is there, trust me :))
    // isMacApp true
    // rating: 0
    //
    // screenshotUrls: https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/5c/08/b8/5c08b824-12eb-e0b6-22fb-0e234f396b9e/pr_source.jpg/800x500bb.jpg
    // https://is1-ssl.mzstatic.com/image/thumb/Purple128/v4/f3/34/0e/f3340e21-714c-0a17-4437-73ba1828cbba/pr_source.jpg/800x500bb.jpg
    // sellerName: MingleBit SRL
    // sellerUrl: https://minglebit.com/products/dynamicwallpaper.php
    // releaseDate: 2018-10-18T14:59:47Z
    // genres: Entertainment, Lifestyle
    // latestVersion: 2.3
    因此,为了集中答案,请使用 Mirror(reflecting: object)得到你想要的。

    关于swift - 是否有与 C#'s ' nameof( )' function to get a variable or member' s name?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47891310/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com