Wraz z wprowadzeniem języka Swift starałem się ogarnąć nowy język
Jestem programistą iOS i używam typów, takich jak NSString, NSInteger, NSDictionary
w aplikacji. Zauważyłem, że w ebooku „The Swift Programming Language” firmy Apple używają typów SwiftString, Int, Dictionary
Zauważyłem, że typy Swift nie mają (lub są inaczej nazywane) niektórych funkcji, które pełnią typy Foundation. Na przykład NSString
ma length
właściwość. Ale nie udało mi się znaleźć podobnego dla Swifta String
.
Zastanawiam się, czy w przypadku aplikacji na iOS powinienem nadal używać typów Foundation?
String
. JednakString
funkcjonalność w wersji alfa jest nadal nieco ograniczona, więc na razieNSString
będzie bardziej używana. Mamy nadzieję, że naprawią API do czasu GA.countElements(str)
, aby odpowiedzieć na konkretną część pytania."foo".length" directly in Swift. An implicit cast to
NSString`, który jest dodawany przez kompilator!Odpowiedzi:
W miarę możliwości należy używać typów natywnych Swift. Język jest zoptymalizowany pod kątem ich używania, a większość funkcji jest połączona pomostem między typami natywnymi i
Foundation
typami.Choć
String
iNSString
to w większości wymienne, to znaczy można przekazaćString
zmienne do metod, które mająNSString
parametry i odwrotnie, niektóre metody wydają się nie być automatycznie mostkiem jak od tej chwili. Zobacz tę odpowiedź, aby zapoznać się z dyskusją o tym, jak uzyskać długość ciągu, a tę odpowiedź,containsString()
aby zapoznać się z dyskusją na temat używania do sprawdzania podciągów. (Zastrzeżenie: jestem autorem obu odpowiedzi)Nie zbadałem w pełni innych typów danych, ale zakładam, że niektóre wersje tego, co zostało powiedziane powyżej, będą również obowiązywać dla
Array
/NSArray
,Dictionary
/NSDictionary
oraz różnych typów liczbowych w Swift iNSNumber
Ilekroć musisz użyć jednego z typów Foundation, możesz użyć ich do jawnego wpisania zmiennych / stałych, jak w,
var str: NSString = "An NSString"
lub użyćbridgeToObjectiveC()
na istniejącej zmiennej / stałej typu Swift, jakstr.bridgeToObjectiveC().length
na przykład. Możesz także przesłać aString
doNSString
, używającstr as NSString
.Jednak konieczność, aby te techniki wyraźnie używały typów Foundation lub przynajmniej niektórych z nich, może być w przyszłości przestarzała, ponieważ z tego, co jest określone w odwołaniu do języka , na przykład
String
/NSString
bridge powinien być całkowicie płynny.Dokładną dyskusję na ten temat można znaleźć w dokumencie Using Swift with Cocoa and Objective-C: Working with Cocoa Data Types
źródło
bridgeToObjectiveC()
i wyjaśnienia związku między NSString a ciągiem Swift's.NSString: tworzy obiekty, które znajdują się w stercie i są zawsze przekazywane przez odwołanie.
Łańcuch: Jest to typ wartości za każdym razem, gdy go przekazujemy, jest przekazywany przez wartość. podobnie jak Struct i Enum, String sam w sobie jest Struct w języku Swift.
Ale kopia nie jest tworzona, gdy zdasz. Tworzy kopię przy pierwszej mutacji.
Ciąg jest automatycznie mostkowany do Objective-C jako NSString. Jeśli biblioteka Swift Standard nie ma, musisz zaimportować framework Foundation, aby uzyskać dostęp do metod zdefiniowanych przez NSString.
Swift String jest bardzo potężny i ma mnóstwo wbudowanych funkcji.
Teraz String jest w stanie wykonać wszystkie operacje, które każdy może wykonać na typie Collection.
Więcej informacji można znaleźć w dokumentach Apple.
źródło
Najlepszym rozwiązaniem jest użycie natywnych typów i klas Swift, jak niektórzy zauważyli, że NSString ma bezpłatne tłumaczenie na String, jednak nie są one takie same w 100%, weź na przykład następujące
musisz użyć metody count (), aby policzyć znaki w łańcuchu, pamiętaj również, że nsstring.length zwraca 2, ponieważ zlicza swoją długość na podstawie UTF16.
Podobnie, TAK To samo, NIE
źródło
String
iNSString
są wymienne, więc nie ma znaczenia, którego z nich użyjesz. Zawsze możesz przesyłać między nimi, używająclub nawet
NSInteger
jest po prostu aliasem dla aint
lub along
(w zależności od architektury), więc po prostu użyjęInt
.NSDictionary
to inna sprawa, ponieważDictionary
jest to zupełnie odrębna implementacja.Ogólnie rzecz biorąc, trzymałbym się szybkich typów, gdy tylko jest to możliwe, i zawsze możesz dokonać konwersji między nimi w razie potrzeby, używając
bridgeToObjectiveC()
metody zapewnianej przez klasy Swift.źródło
Int
książce podano, że typ danych języka Swift jest taki sam, jak rozmiar słowa architektury.NSInteger
jest również taki sam jak rozmiar słowa architektury.Ponieważ obiektywne typy C są nadal dynamicznie wysyłane, prawdopodobnie będą wolniejsze. Powiedziałbym, że najlepiej jest ci służyć przy użyciu typów natywnych Swift, chyba że musisz wchodzić w interakcje z API Objective-c
źródło
Używaj rodzimych typów Swift, kiedy tylko możesz. Jednak w przypadku String masz „bezproblemowy” dostęp do wszystkich
NSString
metod, takich jak ta:źródło
Aktualizacja Swift 4
String otrzymuje poprawki w swift 4. Teraz możesz bezpośrednio wywołać liczenie na nim i traktuje klastry grafemów jako 1 element, jak emoji. NSString nie jest aktualizowany i liczy go w inny sposób.
źródło
NSString
Prawdopodobnie nie zostaną zaktualizowane, aby poradzić sobie z klastrami grafemów: spowodowałoby to uszkodzenie zbyt wielu aplikacji, które opierają się na starym zachowaniu. RównieżNSString.length
zlicza znaki UTF16.Ciąg jest strukturą
// w Swift Module
public struct String
{
}
NSString to klasa
// w module podstawowym
otwarta klasa NSString: NSObject
{
}
źródło