Hi Joe
Sorry for not getting back to you sooner.
Hey, I'm guessing you're busier than I am ;-)
What's necessary here is a way to "open" the type of Any.Type, turning it back into something the compiler considers as a type instead of a value.
Yes, that's what I had in mind
This is something we've discussed having better support for, but right now there's only a sneaky way to do it using protocol extensions. If you constrain Property's type parameter to a protocol:
protocol PropertyType {}
struct Property<T: PropertyType>: PropertyProtocol {}
then you can add a static method to PropertyType in an extension, which can use Self as the opened dynamic type:
extension PropertyType {
private static func create() -> Property<Self> {
return Property<Self>.init()
}
}
Unfortunately, this doesn't compile…
extension PropertyType
{
private static func create() -> Property<Self>
{
return Property<Self>.init()
^ '>' is not a postfix unary operator
}
}
Which is why I found it necessary to add a typealias like so…
extension PropertyType
{
private static func create() -> Property<Self>
{
typealias SelfType = Self
return Property<SelfType>.init()
}
}
and delegate to that extension method in your factory function:
struct PropertyFactory {
static func createBoundPropertywithValueType(valueType: PropertyType.Type) -> PropertyProtocol
{
return valueType.create()
}
}
This doesn't compile either…
struct PropertyFactory
{
static func createBoundPropertywithValueType(valueType: PropertyType.Type) -> PropertyProtocol
{
return valueType.create()
^ Member 'create' cannot be used on value of protocol type 'PropertyType'; use a generic constraint instead
}
}
For some reason, as soon as you change the PropertyType extension static func to return PropertyProtocol…
extension PropertyType
{
private static func create() -> PropertyProtocol
{
typealias SelfType = Self
return Property<SelfType>.init()
}
}
… then, and only then, the factory's method compiles correctly.
Am I really finding bugs or am I still doing something wrong?
Joanna
···
--
Joanna Carter
Carter Consulting