2015-09-01 4 views
2

Я портировал ObjectiveC изготовленный под заказ UIView подклассы до Swift этим утром. Желая сделать его более «объектно ориентированным», я следовал примеру расширения CGContext методами. Например.CGContext И CGContextRef то же самое в Swift? Как это работает?

extension CGContext { 
    func fillColor(color:UIColor) { 
     CGContextSetFillColorWithColor(self, color.CGColor) 
    } 
} 

Потому что я преобразование сообщений объективного стиля C (например -(void) drawOutline: (CGContextRef) cr {...}) в Swift того стиля, не обращая слишком много внимания (например, func drawOutline(cr:CGContextRef) {...}), я не сразу понял, что я проходил CGContextRef аргументов, но был расширенный CGContext (не справка). Но это сработало!

Что было странно, когда я сменил те CGContextRef на CGContext. И он все еще работал. Не просто скомпилирован, но побежал и рисовал правильно. Для удовольствия я изменился на extension CGContextRef. И все же он по-прежнему продолжает работать. Это как если бы Свифт был достаточно умен, чтобы сварить их до одного и того же. Это? Или здесь что-то более тонкое/круто происходит здесь?

+0

Obijective-C и Swift. И вы добавили тег C только для удовольствия, я думаю. – Olaf

+0

Не для удовольствия. Возможно, из-за ошибочной путаницы. Используемые здесь части «ObjectiveC» строго «C» (помните, что ObjectiveC является надмножеством C). 'CGContext' - строгая C-непрозрачная структура. И 'CGContextRef' - это typedef для указателя на то же самое. Думаю, я сделал C, потому что это больше вопрос о том, как Swift переводит части C, чем ObjectiveC. –

ответ

3

Здесь нет ничего особенного. CGContextRef и CGContext - это просто разные имена для (почти) того же самого. Swift просто размывает typedef для вас.

<CoreGraphics/CGContext.h> 

typedef struct CGContext *CGContextRef; 

Смотрите также раздел Using Swift with Cocoa and Objective-C руководства по Основному фонду:

Когда Swift импортирует типы ядра Foundation, компилятор переназначение имен этих типов. Компилятор удаляет Ref с конца каждого имени типа, потому что все классы Swift являются ссылочными типами, поэтому суффикс избыточен.

Они просто решили не отнимать Ref форму имени, я думаю, для старых таймеров, которые используются, чтобы ввести его: D