Mar*_*eIV 5 reflection swift nameof
好的,关于S / O的问题存在,标题如下:
顾名思义,这正是我想要的。但是,查看可接受的答案(以及其他不可接受的答案),他们指的是关键路径操作,这不是我要的。(即,这不是重复的!)
就我而言,我希望将一个变量的名称存储在字符串类型的第二个变量中。
在C#中,使用nameof起来很简单,就像这样……
int someVar = 3
string varName = nameof(someVar)
// 'varName' now holds the string value "someVar"
Run Code Online (Sandbox Code Playgroud)
我相信这是在编译时发生的,而不是在运行时发生的,因此不需要反射或其他任何操作,符号名称也不必在可执行文件中。编译器只是将变量名包含在子变量中。
例如,当您想定义一个查询对象的成员名称与URL中传递的查询参数匹配时,这非常方便。
这是一个伪代码示例(即,显然不会编译,但显示了我的要求):
struct queryObject{
let userName : String
let highScore : Int
var getUrl:String{
return "www.ScoreTracker.com/postScore?\(nameof(userName))=\(userName)&\(nameof(highScore))=\(highScore)"
}
}
Run Code Online (Sandbox Code Playgroud)
这是您的使用方式及其返回的内容:
let queryObject = QueryObject(userName:"Maverick", highScore:123456)
let urlString = queryObject.getUrl
Run Code Online (Sandbox Code Playgroud)
返回值为:
int someVar = 3
string varName = nameof(someVar)
// 'varName' now holds the string value "someVar"
Run Code Online (Sandbox Code Playgroud)
访问变量的字符串表示形式而不是使用字符串常量的优点是:
例如,假设API将查询参数从更改userName为userId。我要做的就是相应地重构我的会员名,现在的输出将是...
struct queryObject{
let userName : String
let highScore : Int
var getUrl:String{
return "www.ScoreTracker.com/postScore?\(nameof(userName))=\(userName)&\(nameof(highScore))=\(highScore)"
}
}
Run Code Online (Sandbox Code Playgroud)
...无需我更改任何字符串常量。
注意:上面的示例仅出于简单说明目的,提供了一种使用变量名称的方式。这不是我们实际处理URL管理或向其中添加查询参数的方式。讨论内容过于冗长,因此本主题不合时宜。
那么,这可以在Swift中完成吗?您可以获取实际的变量名称并将其存储在第二个变量中吗?
是的你可以。我将其用作下一个场景的解决方案:当我在控制台中打印对象/结构时,我喜欢查看变量名称以及关联的值:
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
}
}
Run Code Online (Sandbox Code Playgroud)
为了使用它,我们以以下结构为例:
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
Run Code Online (Sandbox Code Playgroud)
因此,为了集中答案,请使用Mirror(reflecting: object)以获得您想要的东西。