> On Jul 18, 2017, at 3:54 PM, Chris McIntyre <nothingwasdelive...@gmail.com> 
> wrote:
> 
> Was it ever explained why the syntax is different?
> 

Oh. I think convenience initializers on classes are marked as such explicitly 
because convenience vs designated has an effect on the ABI of an initializer, 
for the purposes of inheritance. With a value type, it doesn’t change anything 
about how the initializer is used externally.

Yeah, probably the AST printer should not print the ‘convenience’ keyword on 
non-class initializers.

Slava

> --
> Chris McIntyre
> 
> On Jul 18, 2017, at 6:46 PM, Jens Persson via swift-users 
> <swift-users@swift.org <mailto:swift-users@swift.org>> wrote:
> 
>> That is not true. Structs can have delegating initializers but they cannot 
>> be marked with `convenience` (only the initializers of class types can).
>> 
>> This is very clear from both the documentation and the compiler:
>> 
>> (1) The Swift Programming language (Swift 4):
>> "Swift defines two kinds of initializers for *class* types to help ensure 
>> all stored properties receive an initial value. These are known as 
>> designated initializers and convenience initializers."
>> 
>> (2) The compiler:
>> 
>> struct S {
>>     var a, b: Int
>>     init(_ a: Int, _ b: Int) {
>>         self.a = a
>>         self.b = b
>>     }
>>     convenience init(_ ab: Int) { // <-- Error
>>         self.init(ab, ab)
>>     }
>> }
>> The error message is:
>> Delegating initializers in structs are not marked with 'convenience'
>> The suggested fix is to remove the word convenience.
>> 
>> Please reread my previous post, perform the steps I describe (looking at 
>> Quick Help, also try jump to definition for that `init` and you'll see it is 
>> marked with `convenience` even though it is in a struct), also look at the 
>> link to the documentation for the Int init, it too is marked with 
>> convenience, even though Int is a struct.
>> 
>> /Jens
>> 
>> 
>> On Tue, Jul 18, 2017 at 9:46 PM, Slava Pestov <spes...@apple.com 
>> <mailto:spes...@apple.com>> wrote:
>> Hi Jens,
>> 
>> While I’m not familiar with the integer API in the standard library, structs 
>> and enums certainly can have convenience initializers. They must delegate to 
>> another initializer (either convenience or designated) rather than 
>> initializing the fields of the type one by one.
>> 
>> Slava
>> 
>>> On Jul 18, 2017, at 6:46 AM, Jens Persson via swift-users 
>>> <swift-users@swift.org <mailto:swift-users@swift.org>> wrote:
>>> 
>>> Start a command line project in Xcode 9 beta 3 and copy paste this single 
>>> line of code into main.swift
>>> 
>>> let _ = UInt8.init(extendingOrTruncating: UInt64(123456))
>>> 
>>> Now look at Quick Help while placing the cursor on `init` and then on 
>>> `extendingOrTruncating`.
>>> 
>>> Note that (and how) the documentation for the initializer differs depending 
>>> on where you place the cursor.
>>> 
>>> If the cursor is on `init`, the initializer is shown to be a convenience(!) 
>>> initializer even though structs (such as UInt8) cannot have convenience 
>>> initializers, right?
>>> 
>>> Even the official documentation for this and several other initializer like 
>>> eg:
>>> https://developer.apple.com/documentation/swift/int/2885075-init 
>>> <https://developer.apple.com/documentation/swift/int/2885075-init>
>>> clearly shows convenience initializers in structs.
>>> 
>>> By the way, .init(extendingOrTruncating:) doesn't show in the list of 
>>> completions for "UInt8.init" but it does for "UInt8(".
>>> 
>>> 
>>> Can anyone explain what's going on?
>>> 
>>> Are these known issues that will go away in time for Xcode 9 GM?
>>> 
>>> /Jens
>>> 
>>> _______________________________________________
>>> swift-users mailing list
>>> swift-users@swift.org <mailto:swift-users@swift.org>
>>> https://lists.swift.org/mailman/listinfo/swift-users 
>>> <https://lists.swift.org/mailman/listinfo/swift-users>
>> 
>> 
>> _______________________________________________
>> swift-users mailing list
>> swift-users@swift.org <mailto:swift-users@swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-users 
>> <https://lists.swift.org/mailman/listinfo/swift-users>

_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users

Reply via email to