Betrachten Sie die private C Funktion _UICreateScreenUIImage
, die eine UIImage
Momentaufnahme des aktuellen Gerätebildschirm zurück:Zugang Private UIKit Funktion ohne Verwendung von Bridging-Header
OBJC_EXTERN UIImage *_UICreateScreenUIImage(void) NS_RETURNS_RETAINED;
ich dies in einem Überbrückung-Header und den Zugang in Swift setzen kann wie so:
MeineAnw-Bridging-header.h
@import UIKit;
UIImage *_UICreateScreenUIImage(void) NS_RETURNS_RETAINED;
MyClass.swift
let image = _UICreateScreenUIImage()
print(image) // <UIImage: 0x7fc4ba6081c0>, {375, 667}
Gibt es einen Weg, auf _UICreateScreenUIImage
in reinem Swift ohne Verwendung eines Überbrückungskopfes zuzugreifen?
Ein erster Gedanke war, eine Erweiterung auf UIImage
zu schaffen, aber die Erweiterung erwartet mich den Körper der Funktion in der Verlängerung zu erklären:
extension UIImage {
public func _UICreateScreenUIImage(_: Void) -> UIImage // "Expected '{' in body of function declaration"
}
Diese Implementierung sowieso fehlerhaft ist, als _UICreateScreenUIImage
nicht ist eine Methode auf UIImage
.
Ist das Aussetzen und Zugreifen auf diese Methode in reinem Swift möglich?
Die Leute scheinen meine Frage mit "Wie mache ich einen Screenshot?" Das ist nicht was ich verlange. Ich frage, wie ich in Swift auf Methoden wie UIImage *_UICreateScreenUIImage(void);
zugreifen kann. Es könnte eine beliebige private Methode sein, beispielsweise +(UIImage *)_deviceSpecificImageNamed:(NSString *)name inBundle:(NSBundle *)bundle;
oder +(UIImage *)_pu_PhotosUIImageNamed:(NSString *)name;
.
Dies funktioniert! Tolle! Wo werden 'asmname' und' _silgen_name' dokumentiert? Ist das Äquivalent von "extern C" in Swift? – JAL
Zu meinem Wissen ist nicht dokumentiert (außerhalb von LLVM Interna bin ich mir sicher). Der Ausdruck 'asmname' würde anzeigen, dass er in der Tat äquivalent zu" extern "ist, da er den Assembler einfach anweist, das Symbol an anderer Stelle aufzusuchen. '_silgen_name' würde genauer gesagt bedeuten, dass es' builtined ""() 'Deklarationen während der SIL-Generierung erzeugt (die wiederum vom Assembler ähnlich 'extern' aufgelöst werden). –
Vielen Dank! Ich erwarte, dies als akzeptiert zu betrachten und Ihnen das Kopfgeld zuzusprechen. Eine weitere Folgefrage: Was wäre, wenn ich auf eine private Klassenmethode auf 'UIImage' selbst zugreifen möchte, zum Beispiel:' + (UIImage *) _ pu_PhotosUIImageNamed: (NSString *) name; '?Würde das dem gleichen Muster folgen? – JAL