//===--- ShadowProtocols.swift - Protocols for decoupled ObjC bridging ----===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// // // To implement bridging, the core standard library needs to interact // a little bit with Cocoa. Because we want to keep the core // decoupled from the Foundation module, we can't use foundation // classes such as NSArray directly. We _can_, however, use an @objc // protocols whose API is "layout-compatible" with that of NSArray, // and use unsafe casts to treat NSArray instances as instances of // that protocol. // //===----------------------------------------------------------------------===// #if _runtime(_ObjC) import SwiftShims @objc internal protocol _ShadowProtocol {} /// A shadow for the `NSFastEnumeration` protocol. @objc internal protocol _NSFastEnumeration: _ShadowProtocol { @objc(countByEnumeratingWithState:objects:count:) func countByEnumerating( with state: UnsafeMutablePointer<_SwiftNSFastEnumerationState>, objects: UnsafeMutablePointer?, count: Int ) -> Int } /// A shadow for the `NSEnumerator` class. @objc internal protocol _NSEnumerator: _ShadowProtocol { init() func nextObject() -> AnyObject? } /// A token that can be used for `NSZone*`. internal typealias _SwiftNSZone = OpaquePointer /// A shadow for the `NSCopying` protocol. @objc internal protocol _NSCopying: _ShadowProtocol { @objc(copyWithZone:) func copy(with zone: _SwiftNSZone?) -> AnyObject } /// A shadow for the "core operations" of NSArray. /// /// Covers a set of operations everyone needs to implement in order to /// be a useful `NSArray` subclass. @unsafe_no_objc_tagged_pointer @objc internal protocol _NSArrayCore: _NSCopying, _NSFastEnumeration { @objc(objectAtIndex:) func objectAt(_ index: Int) -> AnyObject func getObjects(_: UnsafeMutablePointer, range: _SwiftNSRange) @objc(countByEnumeratingWithState:objects:count:) override func countByEnumerating( with state: UnsafeMutablePointer<_SwiftNSFastEnumerationState>, objects: UnsafeMutablePointer?, count: Int ) -> Int var count: Int { get } } /// A shadow for the "core operations" of NSDictionary. /// /// Covers a set of operations everyone needs to implement in order to /// be a useful `NSDictionary` subclass. @objc internal protocol _NSDictionaryCore: _NSCopying, _NSFastEnumeration { // The following methods should be overridden when implementing an // NSDictionary subclass. // The designated initializer of `NSDictionary`. init( objects: UnsafePointer, forKeys: UnsafeRawPointer, count: Int) var count: Int { get } @objc(objectForKey:) func object(forKey aKey: AnyObject) -> AnyObject? func keyEnumerator() -> _NSEnumerator // We also override the following methods for efficiency. @objc(copyWithZone:) override func copy(with zone: _SwiftNSZone?) -> AnyObject @objc(getObjects:andKeys:count:) func getObjects( _ objects: UnsafeMutablePointer?, andKeys keys: UnsafeMutablePointer?, count: Int ) @objc(countByEnumeratingWithState:objects:count:) override func countByEnumerating( with state: UnsafeMutablePointer<_SwiftNSFastEnumerationState>, objects: UnsafeMutablePointer?, count: Int ) -> Int } /// A shadow for the API of `NSDictionary` we will use in the core /// stdlib. /// /// `NSDictionary` operations, in addition to those on /// `_NSDictionaryCore`, that we need to use from the core stdlib. /// Distinct from `_NSDictionaryCore` because we don't want to be /// forced to implement operations that `NSDictionary` already /// supplies. @unsafe_no_objc_tagged_pointer @objc internal protocol _NSDictionary: _NSDictionaryCore { // Note! This API's type is different from what is imported by the clang // importer. override func getObjects( _ objects: UnsafeMutablePointer?, andKeys keys: UnsafeMutablePointer?, count: Int) } /// A shadow for the "core operations" of NSSet. /// /// Covers a set of operations everyone needs to implement in order to /// be a useful `NSSet` subclass. @objc internal protocol _NSSetCore: _NSCopying, _NSFastEnumeration { // The following methods should be overridden when implementing an // NSSet subclass. // The designated initializer of `NSSet`. init(objects: UnsafePointer, count: Int) var count: Int { get } func member(_ object: AnyObject) -> AnyObject? func objectEnumerator() -> _NSEnumerator // We also override the following methods for efficiency. @objc(copyWithZone:) override func copy(with zone: _SwiftNSZone?) -> AnyObject @objc(countByEnumeratingWithState:objects:count:) override func countByEnumerating( with state: UnsafeMutablePointer<_SwiftNSFastEnumerationState>, objects: UnsafeMutablePointer?, count: Int ) -> Int } /// A shadow for the API of NSSet we will use in the core /// stdlib. /// /// `NSSet` operations, in addition to those on /// `_NSSetCore`, that we need to use from the core stdlib. /// Distinct from `_NSSetCore` because we don't want to be /// forced to implement operations that `NSSet` already /// supplies. @unsafe_no_objc_tagged_pointer @objc internal protocol _NSSet: _NSSetCore { @objc(getObjects:count:) func getObjects( _ buffer: UnsafeMutablePointer, count: Int ) @objc(getObjects:) func getObjects( _ buffer: UnsafeMutablePointer ) } /// A shadow for the API of NSNumber we will use in the core /// stdlib. @objc internal protocol _NSNumber { var doubleValue: Double { get } var floatValue: Float { get } var unsignedLongLongValue: UInt64 { get } var longLongValue: Int64 { get } var objCType: UnsafePointer { get } } #else internal protocol _NSSetCore {} internal protocol _NSDictionaryCore {} #endif