小编Pri*_*ung的帖子

在Swift中编译时间键路径检查

当我在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中找到一种方法,任何想法?

swift

12
推荐指数
1
解决办法
1393
查看次数

Swift 中与 nil 比较并返回 bool

更新: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

3
推荐指数
1
解决办法
3132
查看次数

标签 统计

swift ×2