我想简化不断的需要
if let firstName = firstName {
self.name = firstName
}
Run Code Online (Sandbox Code Playgroud)
这样做的一个可能的自定义通用运算符
infix operator ?= {}
func ?= <T>(inout left: T, right: T?) {
if let right = right {
left = right
}
}
Run Code Online (Sandbox Code Playgroud)
简化前面的例子
self.name ?= firstName
Run Code Online (Sandbox Code Playgroud)
这会产生一个问题,即如果firstName的值为nil,则Swift会将值包装在一个可选项中.
var name: String? = "Bob"
var firstName: String? = nil
self.name ?= firstName
print(self.name)
/*
prints "nil" since it is wrapping firstName in an optional when
passed in.
E.g. Optional<nil> gets unwrapped to nil in function …Run Code Online (Sandbox Code Playgroud) 从 NSKeyedArchiver 获取崩溃
2016-10-06 17:06:06.713 MessagesExtension[24473:2175316] *** NSForwarding:
warning: object 0x61800009d740 of class '' does not implement
methodSignatureForSelector: -- trouble ahead
Unrecognized selector -[MessagesExtension.Model replacementObjectForKeyedArchiver:]
Run Code Online (Sandbox Code Playgroud)
我创建了一个名为Coding的协议,其全部目的是简化NSCoding和NSKeyedArchiver,而无需使用 Objective-C 的片段。
protocol Coding {
static var directory: FileManager.SearchPathDirectory { get }
static var domainMask: FileManager.SearchPathDomainMask { get }
func encode() -> [String: AnyObject]
init()
init?(dict: [String: AnyObject]?)
}
extension Coding {
static var directory: FileManager.SearchPathDirectory {
return .documentDirectory
}
static var domainMask: FileManager.SearchPathDomainMask {
return .userDomainMask
} …Run Code Online (Sandbox Code Playgroud)