2014-06-20 7 views
56

Przeprowadzam migrację klasy UIViewController, aby wyszkolić trochę za pomocą Swift. Z powodzeniem używam kodu Objective-C przez nagłówek pomostowy, ale potrzebuję importować plik stałych zawierający dyrektywy #define.Jak korzystać z Objective-C#define z Swift

Widziałem w Using Swift with Cocoa and Objective-C (proste makra) następujące:

Proste Makra

Gdzie zazwyczaj stosowane dyrektywy #define zdefiniować prymitywne stałe w C i Objective-C, Zamiast tego zamiast tego używaj stałej globalnej. Na przykład stała definicja #define FADE_ANIMATION_DURATION 0.35 może być lepiej wyrażona w Swift z let FADE_ANIMATION_DURATION = 0.35. Ponieważ proste makra stałe przypominają bezpośrednio globalne zmienne Swift, kompilator automatycznie importuje proste makra zdefiniowane w plikach źródłowych C i Objective-C.

Wygląda na to, że jest to możliwe. Zaimportowałem plik zawierający moje stałe do nagłówka mostkowania, ale nie mam widoczności z mojego pliku .swift, nie można go rozwiązać.

Co powinienem zrobić, aby moje stałe stały się widoczne dla Swifta?

UPDATE:

Wydaje pracy z NSString stałych, ale nie z logicznych:

#define kSTRING_CONSTANT @"a_string_constant" // resolved from swift 
#define kBOOL_CONSTANT YES // unresolved from swift 
+1

spróbuj prawda zamiast tak. –

Odpowiedz

42

Obecnie niektóre #define s są przetwarzane, a niektóre nie. Dokładniej:

#define A 1 

... staje:

var A: CInt { get } 

Lub:

#define B @"b" 

... staje:

var B: String { get } 

Niestety YES i NO aren” t rozpoznaje d konwertowane w locie przez kompilator Swift.

Proponuję przekonwertować swoje #define s na rzeczywiste stałe, co jest lepsze niż #define s i tak.

.h:

extern NSString* const kSTRING_CONSTANT; 
extern const BOOL kBOOL_CONSTANT; 

.m

NSString* const kSTRING_CONSTANT = @"a_string_constant"; 
const BOOL kBOOL_CONSTANT = YES; 

A potem Swift będzie zobaczyć:

var kSTRING_CONSTANT: NSString! 
var kBOOL_CONSTANT: ObjCBool 

Innym rozwiązaniem byłoby zmienić BOOL definiuje się

#define kBOOL_CONSTANT 1 

szybciej. Ale nie tak dobre, jak rzeczywiste stałe.

+0

Czy mogę znać powód, dla którego używasz NSString! a nie String! ? – Ricky

+1

Myślę, że dzieje się tak, ponieważ nigdy nie musisz sprawdzać, czy stała jest zerowa przed użyciem, więc "bezpiecznie" ją rozpakować, gdy jest używana. Jednak pozwoliłbym NSStringowi, ale nie jestem teraz tak komfortowy w tej chwili :) – foOg

+1

Co, jeśli makra są używane do generowania kodu ...? – Ixx

19

Po prostu szybkie wyjaśnienie kilku rzeczy z góry.

Swift Stała wyrażane są za pomocą słowa kluczowego let

na przykład:

let kStringConstant:String = "a_string_constant" 

Również tylko w definicji protokołu można użyć {get} Przykład:

protocol MyExampleProtocol { 
     var B:String { get } 
    } 
7

W swift możesz zadeklarować enum, zmienną lub funkcję poza jakąkolwiek klasą lub funkcją i będzie ona dostępna we wszystkich twoich klasach (globalnie) (bez potrzeby importowania jako konkretny plik).

import Foundation 
    import MapKit 

let kStringConstant:String = "monitoredRegions" 

    class UserLocationData : NSObject {  
class func getAllMonitoredRegions()->[String]{ 
    defaults.dictionaryForKey(kStringConstant) 
} 
+1

uważam, że konieczne jest określenie typu 'kStringConstant', które można wywnioskować na podstawie dostarczonej treści,' "monitorowaneReginy" '. –

+0

Nie, nie bardzo. To tylko praktyka kodowania, każdy zakodowany ciąg, który lubię umieszczać na górze. Później łatwo przenieść go do pliku stałych. –

-1

prosty szybki język nie potrzebują makr wszystkie dyrektywy #define. zostanie podany , a złożone makra powinny zostać przekonwertowane na func

0

Alternatywą dla makra może być zmienna globalna. Możemy zadeklarować zmienną globalną poza klasą i uzyskać dostęp do tych zmiennych bez użycia klasy. Proszę znaleźć przykład poniżej

importowej Fundacji niech BASE_URL = "www.google.com"

Klasa testu {

}