Problem implementing generic method from protocol

The problem is when you do things like:

protocol PropertyProtocol
{
  func getValue<valueType>() throws -> valueType
  
  func setValue<valueType>(_ value: valueType) throws
  
  func copy() -> PropertyProtocol
}

let p: PropertyProtocol = Property(0)

if let c = p as? Copyable // error : Protocol 'Copyable' can only be used as a generic constraint because it has Self or associated type requirements
{
  …
}

And, since I need to hold a list of properties, of different value types, I need to use something like PropertyProtocol as a non-generic type eraser. In this case, I have surfaced a copy() method on the protocol but, if I didn't want to do that and, if I wanted to try to cast any type that implements Copyable to Copyable, I get the error.

There are other situations that don't "like" that way of declaring Copyable and Hamish Knight came up with why in this post Inconsistent protocol Self problem - #5 by Joanna_Carter