看看下面的代码:structSomething{vars:String!//ImplicitlyUnwrappedOptional}funcbind(keyPath:WritableKeyPath){}bind(\Something.s)上面的代码无法编译。如果我们更改bind的签名至bind(keyPath:WritableKeyPath)然后它确实编译了,但问题是V的类型是String!我需要获取基础类型,在本例中为String.我们可以这样解决问题:funcbind(keypath:WritableKeyPath>){}不幸的是文档说ImplicitlyUnwrappedOpti
如果我编写Swift3代码,它将如下所示:letanimation=CABasicAnimation(keyPath:#keyPath(CAShapeLayer.path))但我尝试对keyPath使用Swift4新语法,我得到了:letkeyPath=\CAShapeLayer.pathletanimation=CABasicAnimation(keyPath:keyPath)//errorline>Error:Cannotconvertvalueoftype'ReferenceWritableKeyPath'toexpectedargumenttype'String?'在这种情况下
我知道Swift中泛型的局限性以及它们存在的原因,所以这不是关于编译器错误的问题。相反,我偶尔会遇到一些情况,这些情况似乎可以通过一些可用资源(即泛型、关联类型/协议(protocol)等)的组合来实现,但似乎无法找到解决方案。在这个例子中,我试图想出一个Swift来替代NSSortDescriptor(只是为了好玩)。当你只有一个描述符时,它工作得很好,但是,就像NS版本经常做的那样,创建一个SortDescriptors数组来对多个键进行排序会很好。此处的另一个试验是使用SwiftKeyPaths。因为那些需要Value类型,而比较需要Comparable值,所以我在弄清楚在哪里/