Swift 知其所以然

255 阅读1分钟

Swift 知其所以然

1.default argument not permitted in a protocol method

首先了解一下一个概念 mehtod signature 编译器会会根据方法签名去判断是否方法重复。 但是 default argument 并不在方法签名当中。 下图是MDN针对方法签名的描述:

MDN

swift在设计method signature中也没有新增一些特殊的东西,还是上面描述的东西。所以在方法声明的时候,去协议去增加default argument 是不被允许的。

//TODO: - default argument 的原理实现

2. Error: Escaping closures can only capture inout parameters explicitly by value

场景 Swift中数组是值类型,现在如果想在方法中修改传入的实参,则可以声明实参为inout, 但是如果这个inout类型被逃逸闭包捕获了,则会报这个错误。

首先理解inout的实现:

An in-out parameter has a value that is passed in to the function, is modified by the function, and is passed back out of the function to replace the original value.

大体意思就是inout并不是真正把值复制变成引用,而是创建一个值修改,然后赋值给实参。所以这样的实现,修改实参的值是在函数结束的时间,但是如果逃逸闭包捕获之后,那么修改的时机是无法确定的,所以会报出上述的错误。

如果实现引用类型的修改? 答案是使用 unsafePointer