mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
semantically unambiguous. We didn't actually intend to change how programmers normally constructed these types, but the change to the object literal syntax accidentally caused these initializers to have very natural-seeming signatures. These initializers also created possible ambiguities with the actual initializers. Renaming them to refer to their function as literal initializers is the right thing to do. Unfortunately, this provided to be somewhat annoying, as the code was written to assume that the argument tuple following e.g. #colorLiteral could be directly passed to the initializer. We solve this by hacking on both ends of the constraint system: during generation we form a conversion constraint to the original, idealized parameter type, and during application we rewrite the argument tuple type to use the actual labels. This nicely limits the additional complexity to just the parts dealing with object literals. Note that we can't just implicitly rewrite the tuple expression because that would break invariants tying the labels to physical source ranges. We also don't want to just change the literal syntax again and break compatibility with existing uses. rdar://26148507
243 lines
6.9 KiB
Swift
243 lines
6.9 KiB
Swift
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See http://swift.org/LICENSE.txt for license information
|
|
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
import Foundation
|
|
@_exported import UIKit
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// UIGeometry
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
public extension UIEdgeInsets {
|
|
static var zero: UIEdgeInsets {
|
|
@_transparent // @fragile
|
|
get { return UIEdgeInsets(top: 0.0, left: 0.0, bottom: 0.0, right: 0.0) }
|
|
}
|
|
}
|
|
|
|
public extension UIOffset {
|
|
static var zero: UIOffset {
|
|
@_transparent // @fragile
|
|
get { return UIOffset(horizontal: 0.0, vertical: 0.0) }
|
|
}
|
|
}
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// Equatable types.
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
@_transparent // @fragile
|
|
@warn_unused_result
|
|
public func == (lhs: UIEdgeInsets, rhs: UIEdgeInsets) -> Bool {
|
|
return lhs.top == rhs.top &&
|
|
lhs.left == rhs.left &&
|
|
lhs.bottom == rhs.bottom &&
|
|
lhs.right == rhs.right
|
|
}
|
|
|
|
extension UIEdgeInsets : Equatable {}
|
|
|
|
@_transparent // @fragile
|
|
@warn_unused_result
|
|
public func == (lhs: UIOffset, rhs: UIOffset) -> Bool {
|
|
return lhs.horizontal == rhs.horizontal &&
|
|
lhs.vertical == rhs.vertical
|
|
}
|
|
|
|
extension UIOffset : Equatable {}
|
|
|
|
// These are un-imported macros in UIKit.
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// UIDeviceOrientation
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#if !os(watchOS) && !os(tvOS)
|
|
public extension UIDeviceOrientation {
|
|
var isLandscape: Bool {
|
|
return self == .landscapeLeft || self == .landscapeRight
|
|
}
|
|
|
|
var isPortrait: Bool {
|
|
return self == .portrait || self == .portraitUpsideDown
|
|
}
|
|
|
|
var isFlat: Bool {
|
|
return self == .faceUp || self == .faceDown
|
|
}
|
|
|
|
var isValidInterfaceOrientation: Bool {
|
|
switch (self) {
|
|
case .portrait, .portraitUpsideDown, .landscapeLeft, .landscapeRight:
|
|
return true
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
}
|
|
|
|
@warn_unused_result
|
|
public func UIDeviceOrientationIsLandscape(
|
|
_ orientation: UIDeviceOrientation
|
|
) -> Bool {
|
|
return orientation.isLandscape
|
|
}
|
|
|
|
@warn_unused_result
|
|
public func UIDeviceOrientationIsPortrait(
|
|
_ orientation: UIDeviceOrientation
|
|
) -> Bool {
|
|
return orientation.isPortrait
|
|
}
|
|
|
|
@warn_unused_result
|
|
public func UIDeviceOrientationIsValidInterfaceOrientation(
|
|
_ orientation: UIDeviceOrientation) -> Bool
|
|
{
|
|
return orientation.isValidInterfaceOrientation
|
|
}
|
|
#endif
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
// UIInterfaceOrientation
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#if !os(watchOS) && !os(tvOS)
|
|
public extension UIInterfaceOrientation {
|
|
var isLandscape: Bool {
|
|
return self == .landscapeLeft || self == .landscapeRight
|
|
}
|
|
|
|
var isPortrait: Bool {
|
|
return self == .portrait || self == .portraitUpsideDown
|
|
}
|
|
}
|
|
|
|
@warn_unused_result
|
|
public func UIInterfaceOrientationIsPortrait(
|
|
_ orientation: UIInterfaceOrientation) -> Bool {
|
|
return orientation.isPortrait
|
|
}
|
|
|
|
@warn_unused_result
|
|
public func UIInterfaceOrientationIsLandscape(
|
|
_ orientation: UIInterfaceOrientation
|
|
) -> Bool {
|
|
return orientation.isLandscape
|
|
}
|
|
#endif
|
|
|
|
// Overlays for variadic initializers.
|
|
|
|
#if !os(watchOS) && !os(tvOS)
|
|
public extension UIActionSheet {
|
|
convenience init(title: String?,
|
|
delegate: UIActionSheetDelegate?,
|
|
cancelButtonTitle: String?,
|
|
destructiveButtonTitle: String?,
|
|
// Hack around overload ambiguity with non-variadic constructor.
|
|
// <rdar://problem/16704770>
|
|
otherButtonTitles firstButtonTitle: String,
|
|
_ moreButtonTitles: String...) {
|
|
self.init(title: title,
|
|
delegate: delegate,
|
|
cancelButtonTitle: cancelButtonTitle,
|
|
destructiveButtonTitle: destructiveButtonTitle)
|
|
self.addButton(withTitle: firstButtonTitle)
|
|
for buttonTitle in moreButtonTitles {
|
|
self.addButton(withTitle: buttonTitle)
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#if !os(watchOS) && !os(tvOS)
|
|
public extension UIAlertView {
|
|
convenience init(title: String,
|
|
message: String,
|
|
delegate: UIAlertViewDelegate?,
|
|
cancelButtonTitle: String?,
|
|
// Hack around overload ambiguity with non-variadic constructor.
|
|
// <rdar://problem/16704770>
|
|
otherButtonTitles firstButtonTitle: String,
|
|
_ moreButtonTitles: String...) {
|
|
self.init(title: title,
|
|
message: message,
|
|
delegate: delegate,
|
|
cancelButtonTitle: cancelButtonTitle)
|
|
self.addButton(withTitle: firstButtonTitle)
|
|
for buttonTitle in moreButtonTitles {
|
|
self.addButton(withTitle: buttonTitle)
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#if !os(watchOS)
|
|
internal struct _UIViewQuickLookState {
|
|
static var views = Set<UIView>()
|
|
}
|
|
|
|
extension UIView : _DefaultCustomPlaygroundQuickLookable {
|
|
public var _defaultCustomPlaygroundQuickLook: PlaygroundQuickLook {
|
|
if _UIViewQuickLookState.views.contains(self) {
|
|
return .view(UIImage())
|
|
} else {
|
|
_UIViewQuickLookState.views.insert(self)
|
|
// in case of an empty rectangle abort the logging
|
|
if (bounds.size.width == 0) || (bounds.size.height == 0) {
|
|
return .view(UIImage())
|
|
}
|
|
|
|
UIGraphicsBeginImageContextWithOptions(bounds.size, false, 0.0)
|
|
// UIKit is about to update this to be optional, so make it work
|
|
// with both older and newer SDKs. (In this context it should always
|
|
// be present.)
|
|
let ctx: CGContext! = UIGraphicsGetCurrentContext()
|
|
UIColor(white:1.0, alpha:0.0).set()
|
|
ctx.fill(bounds)
|
|
layer.render(in: ctx)
|
|
|
|
let image: UIImage! = UIGraphicsGetImageFromCurrentImageContext()
|
|
|
|
UIGraphicsEndImageContext()
|
|
|
|
_UIViewQuickLookState.views.remove(self)
|
|
return .view(image)
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
extension UIColor : _ColorLiteralConvertible {
|
|
@nonobjc public required convenience init(colorLiteralRed red: Float,
|
|
green: Float,
|
|
blue: Float, alpha: Float) {
|
|
self.init(red: CGFloat(red), green: CGFloat(green),
|
|
blue: CGFloat(blue), alpha: CGFloat(alpha))
|
|
}
|
|
}
|
|
|
|
public typealias _ColorLiteralType = UIColor
|
|
|
|
extension UIImage : _ImageLiteralConvertible {
|
|
private convenience init!(failableImageLiteral name: String) {
|
|
self.init(named: name)
|
|
}
|
|
|
|
public required convenience init(imageLiteralResourceName name: String) {
|
|
self.init(failableImageLiteral: name)
|
|
}
|
|
}
|
|
|
|
public typealias _ImageLiteralType = UIImage
|