2

В лекционных лекциях WWDC 2013 содержится раздел, в котором в некоторых случаях явные мосты могут быть опущены. Я написал это в Xcode 5 (используя 10.8, но не 10.9), и компилятор жалуется, что мне нужен мостовой переход. Я просто совершенно не понимаю концепцию?CF_IMPLICIT_BRIDGING_ENABLED не работает в xcode5?

#import <Foundation/Foundation.h> 

CF_IMPLICIT_BRIDGING_ENABLED 
CFStringRef MyCreateStringFromNothing(); 
CF_IMPLICIT_BRIDGING_DISABLED 

void SomeFunction() { 
    // compiler requires bridging cast here... 
    NSString* x = MyCreateStringFromNothing();  
} 

Причина, я прошу, я хотел написать:

NSString* s = CFUUIDCreateString(NULL, uuid); 

и подумал, что новая работа по неявным мостикам должна просто позволить мне писать это. Но для этого также нужен мостовой состав.

+0

Когда вы говорите «используя 10,8», можете ли вы быть более конкретным? В игре три вещи: ОС, на которой вы работаете, SDK и цель развертывания. –

+0

. Я получаю те же результаты, что и Xcode работает на 10,8 или 10,9. Кроме того, если целью развертывания является ios7 или 10.9, то те же результаты. – davidbaraff

ответ

0

Проверьте настройки компилятора на проекте и/или цели. Если это более старый проект, у вас может быть паразитный вариант, который заставит вас использовать старый компилятор. (Это помогло мне несколько раз, когда я перешел на Xcode 5 и хотел использовать новейшую новинку Obj-C.)

В наши дни я всегда выбираю «Компилятор по умолчанию» в моих вариантах сборки.

2

Это похоже на черную магию, но из моих экспериментов функции с «Create» в них не работают с неявным мостом.

Когда я собирал это:

CF_IMPLICIT_BRIDGING_ENABLED 
CFStringRef MyCreateStringFromNothing(); 
CFStringRef MyGetStringFromNothing(); 
CF_IMPLICIT_BRIDGING_DISABLED 

void SomeFunction() { 
    NSString *const fails1 = MyCreateStringFromNothing(); 
    NSString *const fails2 = CFStringCreateCopy(kCFAllocatorDefault, CFSTR("FOO")); 

    NSString *const works = MyGetStringFromNothing(); 
} 

Первые два не в состоянии, но третий один «работает»

Обратите внимание, что неявный мост, по-видимому, STILL НЕ позволяет компилятору предупреждать вас о преобразовании CFStringRef в NSString *, он просто перестает требовать, чтобы вы также вставляли __bridge.

Вы заметите, что в слайде на WWDC2013 в сеансе 404 в 50:30 он использует CFDictionaryGetValue(), который возвращает «void *», поэтому это одна из немногих функций, которые не будут вызывать предупреждение. Любая из функций CF, возвращающих фактический тип (например, CFStringRef, или CFDictionary), все еще собирается выдавать предупреждения, поэтому, meh.