[swift-evolution] Proposal: Extend Optional Chaining to Function, Initializer, and Subscript Parameters

Liam Stevenson liam923 at icloud.com
Wed Jul 13 11:16:03 CDT 2016


I'm glad that you agree with me. However, my proposal has been marked as out of scope for swift 3.0, so we'll have to wait a month or so to bring this back up again. 

> On Jul 13, 2016, at 10:24 AM, charles at charlesism.com <charlesism.com at gmail.com> wrote:
> 
> +1
> 
> I'm in favour of this, or something similar. It currently requires a bit more effort to deal with an optional that appears as an argument. It would be a bit nicer to make decisions about control flow when the amount of effort your choices require aren't affected by things like this.
> 
> 
> 
> Sent from my iPhone
> 
>> On Jul 12, 2016, at 7:16 AM, Liam Stevenson via swift-evolution <swift-evolution at swift.org> wrote:
>> 
>> Optional chaining is one of the great, useful features of Swift. It can be used “for querying and calling properties, methods, and subscripts on an optional that might currently be nil,” to quote Apple's "The Swift Programming Language.” However, often it is necessary to call a function, subscript, or initializer conditionally based on if one or more parameters are nil. The proposed solution is to allow a question mark (?) to be placed after an optional value wished to be used as a parameter. Then, the function, initializer, or subscript will be called if and only if the parameter's value is not nil. If it has a return type, it will return an optional, which will be nil if the parameter is nil.
>> 
>> Old way (with seemingly unnecessary if statement considering the flexibility provided by optional chaining):
>> 	var arr = ["apples", "oranges", "pears", "bananas"]
>> 	let index: Int? = 2
>> 
>> 	var removedElement: String?
>> 	if let index = index {
>>   		removedElement = arr.removeAtIndex(index) //sets removedElement to "pears"
>> 	}
>> Using this proposal:
>> 	var arr = ["apples", "oranges", "pears", "bananas"]
>> 	let index: Int? = 2
>> 
>> 	var removedElement: String?
>> 	removedElement = arr.removeAtIndex(index?) //sets removedElement to “pears"
>> Another similar example:
>> Old way:
>> 	var arr = ["apples", "oranges", "pears", "bananas"]
>> 	let index: Int? = nil
>> 
>> 	var removedElement: String?
>> 	if let index = index {
>>   		removedElement = arr.removeAtIndex(index) //never called
>> 	}
>> Using this proposal:
>> 	var arr = ["apples", "oranges", "pears", "bananas"]
>> 	let index: Int? = nil
>> 
>> 	var removedElement: String?
>> 	removedElement = arr.removeAtIndex(index?) //removeAtIndex is never called, and removedElement is set to nil
>> 
>> What does everyone think of this proposal? It is additive so it will not break any existing code, and in the future it will provide conciseness and clarity since the syntax is similar to the existing optional chaining syntax.
>> 
>> View the full proposal on GitHub here: https://github.com/liam923/swift-evolution/blob/master/proposals/NNNN-extend-optional-chaining-to-function-initializer-and-subscript-parameters.md
>> 
>> Liam
>> _______________________________________________
>> 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/20160713/98bbce2a/attachment.html>


More information about the swift-evolution mailing list