当我在Objective-C中实现NSCoding协议时,我想用它NSStringFromSelector(@selector(name))来获取属性的关键路径,如下所示
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:self.accountName forKey:NSStringFromSelector(@selector(accountName))];
[aCoder encodeObject:self.userId forKey:NSStringFromSelector(@selector(userId))];
}
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super init];
if (self) {
_accountName = [aDecoder decodeObjectForKey:forKey:NSStringFromSelector(@selector(accountName))];
_userId = [aDecoder decodeObjectForKey:forKey:NSStringFromSelector(@selector(userId))];
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
我喜欢这种方式,因为它可以防止错误输入,而无需定义大量的字符串常量,如果我重命名这些属性,我会收到警告.但我无法在Swift中找到一种方法,任何想法?
更新:Xcode beta5 之后这个问题不再是问题
似乎 beta3 版本重构了“nil”在幕后的工作方式,但没有提供足够的文档。
我有这段代码在 beta2 中运行良好:
func hasLogin() -> Bool {
return self.credentail != nil
}
Run Code Online (Sandbox Code Playgroud)
但在 beta3 中,我遇到了这个错误
Type 'NativeObject' does not conform to protocol 'NilLiteralConvertible'
Run Code Online (Sandbox Code Playgroud)
self.credential是“Credential”协议的可选值,由 NSObject 子类实现
@objc
protocol Credential: NSObjectProtocol, NSCoding {
}
var credentail: Credential?
Run Code Online (Sandbox Code Playgroud)
我可以通过像这样的双重否定来使其工作,但它看起来确实很荒谬
func hasLogin() -> Bool {
return !(!self.credentail)
}
Run Code Online (Sandbox Code Playgroud)
这是 Swift 中的错误还是我做错了什么?
swift ×2