I disagree. If you look the S
wift 2.2 guide:

"You can also use an asterisk (*) to indicate availability of the declaration 
on all of the platform names listed above."

What this proposal would add is:

"Alternatively, you can use the word 'only' to indicate that the declaration is 
only available on the platform name(s) listed in the attribute."

Sent from my iPhone

> On 27 May 2016, at 09:09, Xiaodi Wu <[email protected]> wrote:
> 
>> On Thu, May 26, 2016 at 7:37 PM, Stuart Breckenridge via swift-evolution 
>> <[email protected]> wrote:
>> On reflection, I think the introduction of a new argument to limit platform 
>> scope is superior — one less attribute to know about.
>> 
>> I've revised the proposal draft: 
>> https://github.com/stuartbreckenridge/swift-evolution/blob/master/proposals/NNNN-add-only-declaration-argument.md
>>  and would welcome further comments.
>> 
>> Add An only Declaration Argument
>> Proposal: SE-NNNN
>> Author: Stuart Breckenridge
>> Status: DRAFT
>> Review Manager: TBD
>> Introduction
>> 
>> Adapted from the Swift 2.2 Programming Guide:
>> 
>> The @available attribute indicates a declaration's life cycle relative to 
>> certain platforms and operating systems. Today's functionality allows you to 
>> add multiple @available attributes on a declaration to specify its 
>> availability on different platforms.
>> In a related Swift Evolution discussion examining the @available attribute, 
>> it was confirmed that there is currently no way to limit availability to 
>> specific platform without using the long form @available approach. 
>> 
>> Motivation
>> 
>> When a declaration is only available on a certain platform, it requires 
>> multiple @available attributes to restrict its availability to that 
>> platform. Consider the following example using SLServiceType like constants:
>> 
>> @available(iOS, unavailable)
>> @available(tvOS, unavailable)
>> @available(watchOS, unavailable)
>> @available(OSX, introduced=10.8)
>> case LinkedIn = "com.apple.social.linkedin"
>> The compiler will only use an @available attribute when the attribute 
>> specifies a platform that matches the current target platform. The 
>> implication being that if the target platform isn't specified, then the 
>> attribute defaults to available.
>> 
>> Thus, while it is clear that the above is restricting availability to OS X 
>> 10.8 and later, it is verbose and can be simplified.
>> 
>> Proposal
>> 
>> Implement an only attribute argument. The effect would be that the compiler 
>> would use only to limit the declaration to be available on the target 
>> platform(s) specified in the attribute. Similar to existing @available 
>> attributes, multiple platforms can be specified in an single declaration and 
>> multiple @available attributes can applied to a single declaration. 
>> 
>> Therefore, where only arguments(s) are present and the target platform is 
>> not specified, the declaration is not available on the unspecified target 
>> platform(s). 
>> 
>> Design
>> 
>> From a design perspective, only would be a new argument for use with 
>> @available. It would replace the trailing * that denotes all other 
>> platforms: only and * cannot be used on the same declaration. 
>> 
>> Syntnax
>> 
>> @available(platform name version number, only) or @available(platform name, 
>> introduced=version number, only)
>> 
>> No changes would be required to other @available arguments. 
>> 
>> Examples
>> 
>> Using the previous example, we use only to scope the declarations 
>> availability:
>> 
>> Single Platform Restriction
>> 
>> @available(OSX 10.8, only)
>> case LinkedIn = "com.apple.social.linkedin"
>> Effect: only available on OS X 10.8 or newer.
>> 
>> Multiple Platform Restriction
>> 
>> @available(OSX 10.8, only)
>> @available(iOS 9.3, only)
>> case LinkedIn = "com.apple.social.linkedin"
>> Effect: Available on OSX 10.8 or newer, and iOS 9.3 or newer.
>> 
>> Restricted within Version Bounds
>> 
>> @available(OSX, introduced=10.8, deprecated=10.10, obsoleted=10.11, 
>> message="No longer available.")
>> case LinkedIn = "com.apple.social.linkedin"
>> Effect: Available on OS X from 10.8 through 10.11 only.
>> 
>> Restricted with Renamed Case
>> 
>> // Initial Release
>> @available(OSX 10.10, only)
>> case TencentWeibo = "com.apple.social.tencentweibo"
>> 
>> // Second Release
>> @available(OSX, introduced=10.10, deprecated=10.11, renamed="Weibo", only)
>> case TencentWeibo = "com.apple.social.tencentweibo"
>> 
>> @available(OSX 10.11, only) case Weibo = "com.apple.social.weibo"
>> Effect: Initial release case is restricted to 10.10 and newer; second 
>> release has the original case deprecated from 10.11, with a new case 
>> introduced which is available on OS X 10.11 and newer only. 
>> 
>> Illegal Usage
>> 
>> @available(OSX 10.8, only)
>> @available(iOS 9.3, *)
>> case LinkedIn = "com.apple.social.linkedin"
>> Reason: * and only are mutually exclusive. 
>> 
>> Benefits & Impact on existing code
>> 
>> only has the benefit of reducing the amount of attribute code, while 
>> maintaining clarity of purpose: it is obvious based on the argument name 
>> what the intent is. 
>> 
> I see what you're going for, but it is not at all obvious what the word 
> "only" means. In fact, the intuitive interpretation of `@available(OSX 10.8, 
> only)` is that "only" applies to the version number and not the 
> platform--i.e. the feature is available only in OS X 10.8 and not in earlier 
> or later versions; that interpretation is only reinforced by your proposed 
> syntax allowing "only" to be written multiple times, once for each platform. 
> The only intuitive interpretation of `@available(OSX 10.8, only)` followed by 
> `@available(iOS 9.3, only)` is that the feature is available only in version 
> 10.8 of OS X and only in version 9.3 of iOS, not that you are restricting 
> availability on other platforms. By contrast, the current syntax is verbose 
> but unambiguous.
>  
>> only is purely additive, and therefore has no impact on existing 
>> declarations that make use of @available. 
>> 
>> Alternatives
>> 
>> An alternative considered was the introduction of an @restricted attribute 
>> that would be used in place of @available. In use:
>> 
>> @restricted(OSX 10.8, *)
>> case LinkedIn = "com.apple.social.linkedin"
>> Effect: Available on OS X 10.8 and newer.
>> 
>> @restricted and only achieve the same goal of providing a simple way of 
>> scoping a declaration's availability to specific platform(s) while reducing 
>> the amount of code required to do so. The general feedback from the initial 
>> proprosal was that an introduction of a new argument (only) was preferred 
>> over the introduction of a new attribute @restricted.
>> 
>> 
>> 
>> 
>> 
>> 
>>>> On 27 May 2016, at 05:14, Brent Royal-Gordon <[email protected]> 
>>>> wrote:
>>>> 
>>>> @available(OS X 10.9, restricted)
>>> 
>>> Personally, I would prefer something like this, perhaps spelled:
>>> 
>>>     @available(OS X 10.9, only)
>>> 
>>> When using shorthand form, you would have to write either `*` or `only` as 
>>> the last element. `*` means "and any other platforms", while `only` means 
>>> "only the listed platforms".
>>> 
>>> -- 
>>> Brent Royal-Gordon
>>> Architechies
>> 
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> [email protected]
>> https://lists.swift.org/mailman/listinfo/swift-evolution
> 

Attachment: smime.p7s
Description: S/MIME cryptographic signature

_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to