Swift:设置协议的可选属性

Mar*_*gan 16 swift

如何设置协议的可选属性?例如,UITextInputTraits具有许多可选的读/写属性.当我尝试以下操作时,我收到编译错误(无法在'textInputTraits'中分配给'keyboardType'):

func initializeTextInputTraits(textInputTraits: UITextInputTraits) {
  textInputTraits.keyboardType = .Default
}
Run Code Online (Sandbox Code Playgroud)

通常在访问协议的可选属性时添加问号,但在分配值时这不起作用(错误:无法分配给此表达式的结果):

textInputTraits.keyboardType? = .Default
Run Code Online (Sandbox Code Playgroud)

协议看起来像:

protocol UITextInputTraits : NSObjectProtocol {
  optional var keyboardType: UIKeyboardType { get set }
}
Run Code Online (Sandbox Code Playgroud)

aka*_*kyy 9

在Swift中这是不可能的(但是?).从ADF线程引用:

可选属性要求和返回值的可选方法要求在访问或调用时始终返回适当类型的可选值,以反映可选要求可能尚未实现的事实.

因此,轻松获得可选值并不奇怪.但是,设置属性需要保证实现.


atl*_*ex2 7

我会考虑将扩展名恢复为默认值keyboardType,并让setter不执行任何操作.

extension UITextInputTraits {
   var keyboardType: UIKeyboardType { 
      get { return .default }
      set { /* do nothing */ } 
   }
}
Run Code Online (Sandbox Code Playgroud)

这样您就可以optional从属性声明中删除它.

protocol UITextInputTraits : NSObjectProtocol {
  var keyboardType: UIKeyboardType { get set }
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您愿意,可以使用可选的返回类型var keyboardType: UIKeyboardType?,并返回nil而不是.Default在您的扩展中.

这样,您可以测试myObject.keyboardType == nil以查看您的属性是否已实现.