[swift-evolution] Proposal: Change of syntax for class protocols

Daniel Valls Estella daniel at upzzle.com
Tue Dec 8 10:34:02 CST 2015


Maybe the restriction of being a class wouldn’t have to do anyting in the protocol definition and it is more a concern of who is managing an element (conforming that protocols and some others).

Avoiding  protocol modifiers and then when using it and if needed:

func doSomething(localvar: MyProtocol class){

	
}


In fact, if it will be constrained that way in other situations:

>>>>> protocol Foo { typealias T: class }
>>>>> 
>>>>> func foo<T: class>(x: T)

I understant T can also be a protocol no only a concrete implementation, a class.


In that way, and it’s another branch to talk about, perhaps it is desirable to constrain method parameters to more than one protocol at a time. 

func doSomething(localvar: MyProtocol Equatable){

	
}



> El 8 des 2015, a les 10:56, Felix Gabel via swift-evolution <swift-evolution at swift.org> va escriure:
> 
> I can only think of one use case for restricting a protocol to be only conformable by structs or enums and that is their special behavior for 'willSet’ and ‘didSet’. But this is already discussed in another thread. 
> 
> It boils down to this: The sole purpose for a class protocol is its memory management semantics.
> 
> 
>> On Dec 8, 2015, at 7:43 AM, Adrian Zubarev via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>> 
>> Lets say (and hope) in some future we’ll be able to write functions like this:
>> 
>> func foo<T: class>(_: T) { /* do something */ }
>> func foo<T: enum>(_: T) { /* do something */ }
>> func foo<T: struct>(_: T) { /* do something */ }
>> 
>> // or we might want to have more than one generic types
>> 
>> func foo<A: class, B: enum, C: struct>(_: A, _: B, _: C) {
>>     // do something better
>> }
>> 
>> // try to use `where` clause with `class A`, `struct C`. It looks ugly to me.
>> So ins’t it better to stick to the original syntax and write code like this!?
>> 
>> protocol MagicType {} // can be applied to any type
>> protocol ClassType: class {} // only for classes
>> protocol StructType: struct {} only for structs
>> protocol ValueType: struct, enum {}  
>> protocol MixedType: struct, class {}
>> This is why in my eyes the current syntax for protocols is just perfect.
>> 
>> 
>> 
>> 
>>>> Regards Adrian
>> 
>> Am 7. Dezember 2015 bei 23:29:34, Felix Gabel via swift-evolution (swift-evolution at swift.org <mailto:swift-evolution at swift.org>) schrieb:
>> 
>>> Great to hear about being able to apply this to type parameters and associated types in the future. But I still propose to rethink the syntax decision. 
>>>  
>>> class protocol FooType {}
>>> typealias class Bar: FooType
>>> func foo<class T>()
>>> 
>>> This is more consistent with for example the declaration of a class or property
>>> 
>>> Construct name: Type
>>> 
>>> On 07 Dec 2015, at 23:04, Douglas Gregor via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>>> 
>>>> 
>>>>> On Dec 7, 2015, at 8:58 AM, Joe Groff via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>>>>> 
>>>>>> 
>>>>>> On Dec 7, 2015, at 8:00 AM, Matthew Cheok via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
>>>>>> 
>>>>>> Currently, we declare class protocols with the following syntax:
>>>>>> 
>>>>>> protocol TestProtocol: class, OtherProtocol {}
>>>>>> 
>>>>>> This is odd for a few reasons:
>>>>>> 1) The keyword class exists in the middle of the declaration
>>>>>> 2) The keyword class follows the colon and looks a lot like inheritance
>>>>>> 3) The keyword class occupies a somewhat arbitrary first position after the colon (otherwise we have an error)
>>>>>> 
>>>>>> We also have another use of the class keyword as a modifier when declaring class methods:
>>>>>> 
>>>>>> class func doSomething() {}
>>>>>> 
>>>>>> I’m suggesting a change of syntax that rectifies the above issues:
>>>>>> 
>>>>>> class protocol TestProtocol: OtherProtocol {}
>>>>>> 
>>>>>> Would love to hear other thoughts on this.
>>>>> 
>>>>> The constraint syntax is used because, in the fullness of time, it should also be applicable to type parameters and associated types:
>>>>> 
>>>>> protocol Foo { typealias T: class }
>>>>> 
>>>>> func foo<T: class>(x: T)
>>>> 
>>>> 
>>>> Right. This is exactly the reason why we have the syntax
>>>> 
>>>> protocol X : class { … }
>>>> 
>>>> and why I’m against changing the current syntax.
>>>> 
>>>> - Doug
>>>> 
>>>> 
>>>> _______________________________________________
>>>> swift-evolution mailing list
>>>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>>>> https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>
>>>  _______________________________________________
>>> swift-evolution mailing list
>>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>
>> 
>> 
>>  _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>
> 
> 
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20151208/59966d24/attachment.html>


More information about the swift-evolution mailing list