Files
swift-mirror/stdlib/public/SDK/UIKit/UIKit.swift
John McCall a1c1693529 Change the names of the object-literal initializers to be
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
2016-05-13 10:33:37 -07:00

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