[swift-evolution] [Pitch] Nil struct
Karl
razielim at gmail.com
Wed Nov 9 09:55:21 CST 2016
-1
Personally, I don’t like writing “nil” at all. In my understanding of Swift, “nil” is simply a C-like shorthand for "Optional<T>.none”.
If the compiler can’t infer T (such as “let a = nil”), it should fall-back to Optional<Any>.none; I’m very surprised that this isn’t the case currently.
There is a bug where the type-checker can’t always infer the type when you just write “.none”, but outside of that I think it’s a swiftier way of doing things: https://bugs.swift.org/browse/SR-2302 <https://bugs.swift.org/browse/SR-2302>
I would be more likely to support the opposite proposal - to eliminate the “nil” literal altogether and replace it with “.none”.
- Karl
> On 8 Nov 2016, at 21:30, Anton Zhilin via swift-evolution <swift-evolution at swift.org> wrote:
>
> Gist link <https://gist.github.com/Anton3/ba56a29986c59e9595368be3cb02fb1b>
> Introduction
>
> Change nil literal type from () to Nil.
> Before:
>
> public protocol ExpressibleByNilLiteral {
> init(nilLiteral: ())
> }
> After:
>
> public struct Nil {
> init()
> }
> public protocol ExpressibleByNilLiteral {
> associatedtype NilLiteralType = Nil
> init(nilLiteral: NilLiteralType)
> }
> Motivation
>
> Currently, nil differs from other literals: it doesn’t have its own type.
> But in some cases we want to deal directly with it, without creating any instances.
>
> The most important use case is comparison of an Optional to nil.
> Currently, this operation is implemented using a hidden struct _OptionalNilComparisonType,
> which is needed precisely because because nil does not have its own type.
> Removal of such underscored types is one of the goals stated in Generics manifesto.
>
> Additionally, declaration of ExpressibleByNilLiteral differs from all other Expressibles,
> because it doesn’t have a Literal type. It is generally beneficial to eliminate special cases.
>
> Proposed solution
>
> Introduce a struct Nil, which becomes the default type for nil literals:
>
> public struct Nil : ExpressibleByNilLiteral {
> init()
> init(nilLiteral: NilLiteralType)
> }
>
> let a = nil
> print(type(of: a)) //=> Nil
> Rewrite ExpressibleByNilLiteral:
>
> public protocol ExpressibleByNilLiteral {
> associatedtype NilLiteralType = Nil
> init(nilLiteral: NilLiteralType)
> }
> Make use of Nil in the standard library:
>
> public func == <T>(left: T?, right: Nil)
> public func == <T>(left: Nil, right: T?)
> public func != <T>(left: T?, right: Nil)
> public func != <T>(left: Nil, right: T?)
> public func ~= <T>(left: Nil, right: T?)
> Source compatibility
>
> Nil identifier is taken, therefore applications that already use it will stop compiling.
> Automatic migration is somewhat possible by renaming of the old entity; manual migration is recommended.
>
> Applications that use declare ExpressibleByNilLiteral conformances will stop compiling.
> Automatic migration is possible.
>
> Effect on ABI stability
>
> Applications that use Nil identifier will have to make ABI-breaking changes.
>
> Otherwise, the change can mostly be applied in an ABI-compatible manner.
>
> _______________________________________________
> 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/20161109/44f8fbf0/attachment.html>
More information about the swift-evolution
mailing list