小编S.M*_*ore的帖子

自定义运算符简化If-Let

我想简化不断的需要

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)

generics ios swift

5
推荐指数
1
解决办法
492
查看次数

Swift 3 - NSCoding 没有继承 NSObject 的烦恼

从 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的协议,其全部目的是简化NSCodingNSKeyedArchiver,而无需使用 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)

objective-c nscoding ios swift

2
推荐指数
1
解决办法
706
查看次数

标签 统计

ios ×2

swift ×2

generics ×1

nscoding ×1

objective-c ×1