Ответ 1
Вы можете сделать тот самый трюк, который вы сделали бы, если бы ваш проект был Objective-C.
Создайте файл заголовка и поместите объявление категории в класс вместе с объявлением частных методов, которые вы хотите открыть. Затем скажите компилятору Swift импортировать этот заголовок моста.
В демонстрационных целях я буду выступать во внутренности NSBigMutableString
, частного подкласса NSMutableString
, и я назову его метод _isMarkedAsImmutable
.
Обратите внимание, что здесь весь класс сам по себе является частным, поэтому я должен сначала объявить его как подкласс своего реального суперкласса. Из-за этого я мог бы также объявить метод прямо в объявлении самого класса; что, однако, не продемонстрировало бы использование категории (Private)
трюков.
Если ваш класс является общедоступным, то, очевидно, вам понадобится только категория, и вам не понадобится (повторно) объявить сам класс.
Bridge.h:
#import <Foundation/Foundation.h>
@interface NSMutableString (Private)
- (BOOL)_isMarkedAsImmutable; // this is a lie
@end
@interface NSBigMutableString : NSMutableString
@end
s.swift:
let s = NSBigMutableString()
println(s._isMarkedAsImmutable())
Скомпилировать и запустить:
$ xcrun -sdk macosx swiftc -o foo -import-objc-header Bridge.h s.swift
$ ./foo
false
$