2015-04-29 2 views
3

Если вы определили быстрый класс, как этоКак создать объект Swift в Objective-C?

@objc class Cat { 

} 

В стрижа вы можете просто сделать

var c = Cat() 

Но как сделать Cat экземпляр в Objective-C?

Подкласс NSObject работает, потому что вы можете «alloc-init», но можем ли мы достичь этого без подкласса класса Objective-C?

+0

Возможно [это] (https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/BuildingCocoaApps/MixandMatch.html#//apple_ref/doc/uid/TP40014216-CH10-XID_77) статья поможет вам – user2340612

ответ

2

Самый прямой способ заключается в подклассе Cat от NSObject. Если вы не можете этого сделать, вам нужно будет создать метод класса или функцию, которая возвращает Cat.

@objc class Cat { 
    class func create() -> Cat { 
     return Cat() 
    } 
} 
func CreateCat() -> Cat { 
    return Cat() 
} 


Cat *cat = [Cat create]; 
Cat *cat = CreateCat(); 
1

В современной Objective-C можно назвать такие функции, как они были свойствами:

Swift:

class func create() -> Cat { 
    return Cat() 
} 

Obj-C:

Cat *cat = Cat.create; 
+0

Хотя так можно вызвать методы класса из-за того, как реализован компилятор, обычно это плохая форма. Точечная запись явно предназначена для доступа к свойствам в ObjC. См. «Точечный синтаксис является кратким альтернативом вызовам метода доступа» https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html#//apple_ref/doc/uid/TP40011210 -CH5-SW5 "Синтаксис Dot - это просто удобная оболочка вокруг вызовов метода доступа". –

0

Вы можете объявить +alloc в (не требуется его реализация):

@interface Cat (Alloc) 
+ (instancetype)alloc; 
@end 

, а затем вы можете использовать регулярные Alloc-Init на нем:

Cat *cat = [[Cat alloc] init]; 

все без необходимости менять Swift код.