GVKun编程网logo

如何使用名称空间(或框架名称)将Swift类型名称作为字符串获取(swift的命名空间)

11

如果您对如何使用名称空间和或框架名称将Swift类型名称作为字符串获取感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解如何使用名称空间的各种细节,并对或框架名称将Swift类型名称作为字符串获取

如果您对如何使用名称空间或框架名称将Swift类型名称作为字符串获取感兴趣,那么这篇文章一定是您不可错过的。我们将详细讲解如何使用名称空间的各种细节,并对或框架名称将Swift类型名称作为字符串获取进行深入的分析,此外还有关于bash – 获取变量的名称作为输入,并使用该名称更改变量、c – 如何根据别名对名称空间进行别名并扩展原始名称空间、c – 将变量名称作为字符串传递给默认参数、c# – 从对象获取属性信息,而不将属性名称作为字符串的实用技巧。

本文目录一览:

如何使用名称空间(或框架名称)将Swift类型名称作为字符串获取(swift的命名空间)

如何使用名称空间(或框架名称)将Swift类型名称作为字符串获取(swift的命名空间)

有什么办法可以将Swift类型名称作为带有名称空间(或框架名称)的字符串?

例如,如果Foo.framework有一个名为的类Bar,我想获取类似的字符串"Foo.Bar"

以下仅返回类名"Bar"

let barName1 = String(Bar.self)       // returns "Bar"let barName2 = "\(Bar.self)"          // returns "Bar"let barName3 = "\(Bar().dynamicType)" // returns "Bar"

我还想获得框架名称"Foo"作为名称空间。

答案1

小编典典

用途String(reflecting:)

struct Bar { }let barName = String(reflecting: Bar.self) print(barName) // <Module>.Bar

从Xcode
7发行说明:

默认情况下,现在可以打印类型名称和枚举大小写,并将其转换为String而不带限定符。debugPrintString(reflecting:)仍可用于获取完全限定的名称。

bash – 获取变量的名称作为输入,并使用该名称更改变量

bash – 获取变量的名称作为输入,并使用该名称更改变量

我从脚本用户获取变量的名称作为第一个参数,并将所述变量的值回显给控制台:
#!/bin/bash
variablename=$1
echo "The value of $variablename is: " ${!variablename}

这很棒!

我无法工作的是,如果我想将该变量更改为用户的第二个参数的值.语法错误的示例是:

#!/bin/bash
variablename=$1
echo "The value of $variablename is: " ${!variablename}
echo "I will Now try to change the value into $2."
(!variablename}=$2
# The above line generates: {!variablename}=2: command not found

换句话说:如果可能,我如何从用户获取变量名称并读取(已经解决)并写入所述变量?

在请求帮助后几分钟我突然闪过,我想我有一个解决方案:
#!/bin/bash
variablename=$1
echo "The value of $variablename is: " ${!variablename}
echo "I will Now try to change the value into $2."
eval "$variablename=$2"
echo "Success! $variablename Now has the value ${!variablename}!"

有用.有没有更好的办法?

c – 如何根据别名对名称空间进行别名并扩展原始名称空间

c – 如何根据别名对名称空间进行别名并扩展原始名称空间

我在C中遇到了当前的问题:

我有一个给定外部库的命名空间.我不喜欢这个外部命名空间的名称,所以我做了以下这样的事情:

namespace mynamespace = othernamespace;

如果我想说以下内容,这可以正常工作:

mynamespace::foo(...);

但是我发现我需要一个特殊的函数来将othernamespace中的值转换为外部库中的值.我通过以下方式定义了一个函数:

Y xToY(mynamespace::X x);

我意识到我只想在mynamespace的上下文中使用这个函数,我仍然不喜欢使用其他名称空间的命名空间名称所以我认为很简单,我会做以下事情:

namespace mynamespace = othernamespace;

namespace mynamespace{
    Y xToY(mynamespace::X x);
}

但是我得到以下编译器错误告诉我这不能做到:

myheader.h:13:11: error: namespace alias 'mynamespace' not allowed here,assuming 'othernamespace'

因此它不会编译.注意我目前正在使用c 14.我想知道是否可以使用命名空间othernamespace的别名来扩展此命名空间.

解决方法

不.不幸的是,这是不可能的.来自[namespace.def]的规则明确排除了别名:

In a named-namespace-deFinition,the identifier is the name of the namespace. If the identifier,when looked up (3.4.1),refers to a namespace-name (but not a namespace-alias) that was introduced in the
namespace in which the named-namespace-deFinition appears or that was introduced in a member of the inline namespace set of that namespace,the namespace-deFinition extends the prevIoUsly-declared namespace.
Otherwise,the identifier is introduced as a namespace-name into the declarative region in which the named-namespace-deFinition appears.

您不能通过别名扩展名称空间,只能通过原始名称空间名称扩展名称空间.

c – 将变量名称作为字符串传递给默认参数

c – 将变量名称作为字符串传递给默认参数

假设有一个调试功能,简化如下:

void DumpString(char* var,char* varname) {
    printf("%s : '%s'\n",varname,var);
}

char str[10]="foobar";
DumpString(str,"str");

> str : foobar

让我们更容易通过删除两次传递变量的不必要的无关要求,一次在引号中:

#define VarasstR(v) #v

void DumpString(char* var) {
    printf("%s : '%s'\n",VarasstR(var),var);
}

char str[10]="foobar";
DumpString(str);

> var : foobar

哎呀!它使用局部变量名而不是传入的名称.让我们尝试不同的(并且不太理想)大头钉:

#define DumpStr(v) DumpString(v,#v)

void DumpString(char* var,var);
}

char str[10]="foobar";
DumpStr(str);

> str : foobar

太棒了.但是如果函数稍微复杂一点怎么办:

void DumpString(char* var,char* varname,int optionalvar=0) {
    printf("%s : '%s'\n",var);
    printf("blah: %d",optionalvar);
}

不能重载宏,因此DumpStr不起作用,我们已经排除了VarasstR的版本.

如何处理(不使用多个类似但不同名称的函数/宏)?

解决方法

这是非标准的,但作为GNU C的扩展:

#define DumpStr(v,...) DumpString(v,#v,##__VA_ARGS__)

在GNU C中,您可以不向可变参数宏传递任何参数,并且在逗号和空可变参数列表之间应用“标记粘贴运算符”##时不会产生任何内容(因此尾随逗号被抑制).

在Visual C中,我认为令牌粘贴操作符##是不必要的(并且可能会破坏宏),因为如果它出现在空的可变参数列表之前,Visual C会自动抑制尾随逗号.

请注意,唯一使这种非标准的是希望有时传递一个空参数列表. Variadic宏在C99和C 11中都是标准化的.

编辑:这是一个不使用非标准功能的示例.你可以看到为什么有些人真的希望在标准中解决这类问题:

#define DUMPSTR_1(v) DumpString(v,#v)
#define DUMPSTR_2(v,opt) DumpString(v,opt)
#define DUMPSTR_NARG(...) DUMPSTR_ARG_N(__VA_ARGS__,4,3,2,1,0)
#define DUMPSTR_ARG_N(_1,_2,_3,_4,n,...) n
#define DUMPSTR_NC(f,...) f(__VA_ARGS__)
#define DUMPSTR_NB(nargs,...) DUMPSTR_NC(DUMPSTR_ ## nargs,__VA_ARGS__)
#define DUMPSTR_NA(nargs,...) DUMPSTR_NB(nargs,__VA_ARGS__)
#define DumpStr(...) DUMPSTR_NA(DUMPSTR_NARG(__VA_ARGS__),__VA_ARGS__)

可能有一些更简洁的方法来做到这一点.但不是那么多.

编辑2:这是另一个不使用非标准功能的例子,由R..提供

#define STRINGIFY_IMPL(s) #s
#define STRINGIFY(s) STRINGIFY_IMPL(s)
#define ARG1_IMPL(a,...) a
#define ARG1(...) ARG1_IMPL(__VA_ARGS__,0)
#define DumpStr(...) DumpString(STRINGIFY(ARG1(__VA_ARGS__)),__VA_ARGS__)

请注意,这需要更改DumpString的参数顺序,以便字符串化的函数名称是第一个参数.

c# – 从对象获取属性信息,而不将属性名称作为字符串

c# – 从对象获取属性信息,而不将属性名称作为字符串

出于某些原因,我需要创建一个PropertyInfo实例的Dictionary,它对应于某些类的属性(让我们称之为EntityClass).

好的,我可以使用typeof(EntityClass).GetProperties().

但我还需要确定某些特定属性的值(在编译时已知).
通常我可以做以下其中一项:

EntityInstance.PropertyX = Value;
typeof(EntityClass).GetProperty("PropertyX").SetValue(EntityInstance,Value,null);

为了填满我的字典,我需要使用PropertyInfo实例而不是仅正常设置值.但我觉得通过字符串名称获取属性并不舒服.如果某些EntityClass发生更改,则会带来许多异常而不是编译错误.所以,我要问的是:

如何在不传递字符串名称的情况下获取已知属性的PropertyInfo?
如果有像代表一样的东西,我会很高兴:

SomeDelegateType MyDelegate = EntityInstance.MethodX;

理想的情况是:

SomePropertyDelegate MyPropertyDelegate = EntityInstance.PropertyX;

解决方法

像这样的东西?

string s = GetPropertyName<User>( x=> x.Name );

public string GetPropertyName<T>(Expression<Func<T,object>> lambda)
{
    var member = lambda.Body as MemberExpression;
    var prop = member.Member as PropertyInfo;
    return prop.Name;
}

要么

public PropertyInfo GetPropertyInfo<T>(Expression<Func<T,object>> lambda)
{
    var member = lambda.Body as MemberExpression;
    return member.Member as PropertyInfo;
}
public class User
{
    public string Name { set; get; }
}

今天关于如何使用名称空间或框架名称将Swift类型名称作为字符串获取的介绍到此结束,谢谢您的阅读,有关bash – 获取变量的名称作为输入,并使用该名称更改变量、c – 如何根据别名对名称空间进行别名并扩展原始名称空间、c – 将变量名称作为字符串传递给默认参数、c# – 从对象获取属性信息,而不将属性名称作为字符串等更多相关知识的信息可以在本站进行查询。

本文标签: