Swift 使用变量的值进行属性查找
我试图在代码中构建当前语言环境属性的表,在尝试将变量的值传递给函数时遇到问题:Swift 使用变量的值进行属性查找,swift,properties,Swift,Properties,我试图在代码中构建当前语言环境属性的表,在尝试将变量的值传递给函数时遇到问题: let currentLocale = Locale(identifier: "en_US") let calendar1 = currentLocale.calendar // "gregorian (fixed)" let propertyName = "calendar" let calendar2 = currentLocale.propertyName // Error: Value of t
let currentLocale = Locale(identifier: "en_US")
let calendar1 = currentLocale.calendar // "gregorian (fixed)"
let propertyName = "calendar"
let calendar2 = currentLocale.propertyName // Error: Value of type 'Locale' has no member 'porpertyName'
在上面的最后一行代码中,Locale实例认为我传递的是“propertyName”,而不是变量“calendar”的内容
有没有办法将propertyName(“日历”)的值传递给Locale实例?我知道在其他语言中,可以在变量名前面加上“$propertyName”,这会告诉它读取变量的值
如果可能的话,我想保持这种纯粹的快捷方式。您正在寻找某种形式的 这有点棘手,因为这是Cocoa的纯Objective-C特性,所以它不适用于Swift overlay类Locale;您必须将
currentLocale
转换为Objective-C NSLocale。此外,NSLocale通过特殊的NSLocale.Key类型公开其属性。经过大量的铸造,我发现这是有效的:
let calendar2 =
(currentLocale as NSLocale).object(forKey:NSLocale.Key(rawValue:propertyName))
calendar2
是按任意方式键入的,但您可以将其转换为字符串。您正在寻找某种形式的日历
这有点棘手,因为这是Cocoa的纯Objective-C特性,所以它不适用于Swift overlay类Locale;您必须将currentLocale
转换为Objective-C NSLocale。此外,NSLocale通过特殊的NSLocale.Key类型公开其属性。经过大量的铸造,我发现这是有效的:
let calendar2 =
(currentLocale as NSLocale).object(forKey:NSLocale.Key(rawValue:propertyName))
calendar2
键入为Any,但您可以将其转换为字符串。对象(forKey:)
,NSLocale
上的方法需要有效的NSLocale组件键,而“calendar”不是。你是说valueForKey(:)
?是的@Matt,当我把那行代码插入代码时,我得到了一个错误:“Locale”类型的值没有成员“object”。是的,我让它工作了,但这并不容易!这是一个比我预想的有趣得多的挑战。@Matt,这是可行的,但我必须承认这并不是我预想的。非常感谢你给了我一个有效的答案!由于Swift可以推断出NSLocale.Key
类型的forKey:
参数,因此也可以将其编写为.object(forKey:.init(rawValue:propertyName))
——尽管这可能会牺牲简洁性。对象(forKey:)
,但NSLocale
上的方法需要有效的NSLocale组件键,哪个“日历”不是。你是说valueForKey(:)
?是的@Matt,当我把那行代码插入代码时,我得到了一个错误:“Locale”类型的值没有成员“object”。是的,我让它工作了,但这并不容易!这是一个比我预想的有趣得多的挑战。@Matt,这是可行的,但我必须承认这并不是我预想的。非常感谢你给了我一个有效的答案!因为Swift可以推断出forKey:
参数的NSLocale.Key
类型,所以您也可以将其编写为.object(forKey:.init(rawValue:propertyName))
——尽管这可能会牺牲简洁性。您没有使用参数调用函数,也没有使用参数调用函数。