[swift-evolution] Proposal: Improve Import of Scanner APIs into Swift 3

Ben Rimmington me at benrimmington.com
Wed Nov 30 07:56:24 CST 2016


<https://github.com/apple/swift-corelibs-foundation/blob/5f8656628c79bf4df3980efbf45dfb3eebd35766/Foundation/NSScanner.swift#L485-L487>

	/// Revised API for avoiding usage of AutoreleasingUnsafeMutablePointer and better Optional usage.
	/// - Experiment: This is a draft API currently under consideration for official import into Foundation as a suitable alternative
	/// - Note: Since this API is under consideration it may be either removed or revised in the near future
	extension Scanner {
	    public func scanInt() -> Int32?
	    public func scanInteger() -> Int?
	    public func scanLongLong() -> Int64?
	    public func scanUnsignedLongLong() -> UInt64?
	    public func scanFloat() -> Float?
	    public func scanDouble() -> Double?
	    public func scanHexInt() -> UInt32?
	    public func scanHexLongLong() -> UInt64?
	    public func scanHexFloat() -> Float?
	    public func scanHexDouble() -> Double?
	    public func scanString(string searchString: String) -> String?
	    public func scanCharactersFromSet(_ set: CharacterSet) -> String?
	    public func scanUpToString(_ string: String) -> String?
	    public func scanUpToCharactersFromSet(_ set: CharacterSet) -> String?
	}

Foundation issues should be discussed on the swift-corelibs-dev list.

-- Ben

> On 30 Nov 2016, at 10:10, Oliver Drobnik via swift-evolution <swift-evolution at swift.org> wrote:
> 
> Working on a function for Foundation’s Scanner I stumbled on this LLVM crash: https://bugs.swift.org/browse/SR-3295 <https://bugs.swift.org/browse/SR-3295>
> 
> This got me thinking about a workaround and I would like to prose this:
> 
> When importing Foundation into Swift 3, all 
> 
> AutoreleasingUnsafeMutablePointer<T?>?
> 
> should instead be exposed as simple:
> 
> inout T?
> 
> e.g.
> 
> open func scanString(_ string: String, into result: AutoreleasingUnsafeMutablePointer<NSString?>?) -> Bool
> 
> would become
> 
> open func scanString(_ string: String, into result: inout String?) -> Bool
> 
> 
> The call would stay exactly the same for normal use cases where you specify a receiving variable:
> 
> var string: String?
> scanString("=", into: &string)
> 
> because inout parameters require a &
> 
> 
> for the use case where you don’t require a receiving parameter, a second method without result parameter would be generated:
> 
> open func scanString(_ string: String) -> Bool
> 
> This is necessary because you cannot specify nil or an immutable value for an inout parameter. 
> 
> 
> A fixit/migration would change calls to
> 
> scanString(“foo", into result: nil)
> 
> into
> 
> scanString(“foo")
> 
> 
> The normal call with receiving variable would stay the same. But the case without return would become more concise.
> 
> What do you think?
> 
> kind regards
> Oliver Drobnik
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20161130/26e5c4a7/attachment.html>


More information about the swift-evolution mailing list