Swift-어떤 유형을 사용할까요? NSString 또는 String


109

Swift의 도입과 함께 저는 새로운 언어를 이해하려고 노력했습니다.

저는 iOS 개발자이며 NSString, NSInteger, NSDictionary응용 프로그램에서 와 같은 유형을 사용 합니다. Apple의 "The Swift Programming Language"ebook에서 Swift 유형을 사용합니다.String, Int, Dictionary

Swift 유형에는 Foundation 유형이 수행하는 일부 기능이 없거나 이름이 다릅니다. 예를 들어 NSStringlength속성을. 그러나 나는 Swift와 비슷한 것을 찾을 수 없었습니다.String .

iOS 애플리케이션의 경우 여전히 Foundation 유형을 사용해야합니까?


3
선호 String. 그러나 String알파 릴리스 에서는 기능이 여전히 약간 제한되어 있으므로 지금 NSString은 더 많이 사용됩니다. GA까지 API를 수정하기를 바랍니다.
Sulthan 2014-06-04

1
또한으로 전화 countElements(str)하여 질문의 특정 부분에 답변 할 수 있습니다 .
Nate Cook

더 나은, 당신은 "foo".length" directly in Swift. An implicit cast to 컴파일러에 의해 추가 된 NSString` 을 호출 할 수 있습니다 !
Gabriele Petronella 2014-06-05

1
@GabrielePetronella .length는 특수 문자에 대해 올바르게 작동하지 않을 수 있습니다. 2 개 또는 3 개의 유니 코드 문자를 차지하는 이모티콘 또는 중국어 문자와 같은. countElements는 올바른 사용 방법입니다.
Fogmeister 2014-06-09

답변:


98

가능할 때마다 Swift 기본 유형을 사용해야합니다. 언어는이를 사용하도록 최적화되어 있으며 대부분의 기능은 기본 유형과 유형간에 연결 Foundation됩니다.

StringNSString대부분은 상호 교환이 가능 하지만 , 즉 매개 String변수를 사용하는 메소드에 변수를 전달할 수 NSString있고 그 반대의 경우도 가능하지만 일부 메소드는 현재 자동으로 연결되지 않는 것 같습니다. 문자열의 길이 와이 답변 을 얻는 방법에 대한 토론 은 이 답변 을 참조하십시오. 사용하는 방법에 대한 설명은containsString() 문자열을 확인 할 수 있습니다. (면책 조항 :이 두 답변의 저자입니다)

다른 데이터 유형을 완전히 탐색하지는 않았지만 위에서 언급 한 일부 버전이 Array/ NSArray, Dictionary/NSDictionary 및 Swift의 다양한 숫자 유형NSNumber

Foundation 유형 중 하나를 사용해야 할 때마다 변수 / 상수를 명시 적으로 입력 var str: NSString = "An NSString"하거나 예를 들어 bridgeToObjectiveC()Swift 유형의 기존 변수 / 상수에 사용할 수 있습니다 str.bridgeToObjectiveC().length. a StringNSString을 사용하여str as NSString .

그러나 이러한 기술이 Foundation 유형 또는 최소한 일부를 명시 적으로 사용하는 데 필요한 필요성은 언어 참조에 명시된 내용에서 String/NSString 예를 들어 브리지가 완전히 매끄럽게 이루어져야하기 .

주제에 대한 자세한 논의 는 Cocoa 및 Objective-C와 함께 Swift 사용 : Cocoa 데이터 유형 작업을 참조하십시오 .


4
+1 bridgeToObjectiveC()은 NSString과 Swift의 String 사이의 연결을 참조 하고 설명합니다.
크리스

2
안녕하세요, cezar, 답변을 업데이트하려는 경우 bridgeToObjectiveC가 더 이상 사용되지 않는다고 생각합니다.
Dan Beaulieu 2015

Swift 3 매뉴얼에서 Foundation 유형은 참조로 전달되고 기본 유형은 값으로 전달됩니다 (또는이 시점에서 완전히 이해하지 못하는 것과 같은 것). 그 의미를 논의하는 답변을 업데이트 할 수 있다면 좋을 것입니다.
Nigel B. Peck

27

NSString : 힙에 상주하고 항상 참조로 전달되는 객체를 생성합니다.

문자열 : 전달할 때마다 값 유형이며 값으로 전달됩니다. Struct 및 Enum과 마찬가지로 String 자체는 Swift의 Struct입니다.

public struct String {
 // string implementation 
}

그러나 통과하면 사본이 생성되지 않습니다. 처음 변경하면 복사본이 생성됩니다.

String은 NSString으로 Objective-C에 자동으로 연결됩니다. Swift Standard Library에없는 경우 NSString으로 정의 된 메소드에 액세스하려면 Foundation 프레임 워크를 가져와야합니다.

Swift String은 강력한 내장 기능을 가지고 있습니다.

문자열 초기화 :

var emptyString = ""             // Empty (Mutable)
let anotherString = String()     // empty String immutable    
let a = String(false)           // from boolean: "false"
let d = String(5.999)           //  "    Double "5.99"
let e = String(555)             //  "     Int "555"
// New in Swift 4.2 
let hexString = String(278, radix: 18, uppercase: true) // "F8"

반복되는 값에서 문자열 만들기 :

 let repeatingString = String(repeating:"123", count:2) // "123123"

Swift 4에서-> 문자열은 문자 모음입니다.

이제 String은 누구나 Collection 유형에서 수행 할 수있는 모든 작업을 수행 할 수 있습니다.

자세한 내용은 애플 문서를 참조하십시오.


2
이 답변은 더 많은 찬성 투표를 받아야합니다. 이것이 String과 NSString의 근본적인 차이점입니다. 다른 모든 곳에서 거의 상호 교환 가능
Max

좋은 대답입니다. 특히 값 대 참조 유형 참고.
spnkr

11

가장 좋은 방법은 Swift 네이티브 유형과 클래스를 사용하는 것입니다. 다른 사람들은 NSString이 무료로 String으로 번역한다고 언급했지만, 100 %는 같지 않습니다. 예를 들면 다음과 같습니다.

var nsstring: NSString = "\U0001F496"
var string: String = "\U0001F496"

nsstring.length
count(string)

문자열의 문자 수를 계산하려면 count () 메서드를 사용해야합니다. 또한 nsstring.length는 UTF16을 기반으로 길이를 계산하므로 2를 반환합니다.

유사 함, 예 동일 함, 아니오


7

String그리고 NSString정말 당신이 사용하는 하나의 문제가되지 않도록, 교환 할 수있다. 다음을 사용하여 항상 둘 사이에 캐스팅 할 수 있습니다.

let s = "hello" as NSString

또는

let s: NSString  = "hello"

NSIntegerint또는 a long(아키텍처에 따라 다름)에 대한 별칭 이므로 Int.

NSDictionaryDictionary완전히 별개의 구현 이기 때문에 다른 문제 입니다.

일반적으로 나는 가능할 때마다 빠른 유형을 고수 bridgeToObjectiveC()하고 빠른 클래스에서 제공 하는 방법을 사용하여 필요할 때 항상 둘 사이를 변환 할 수 있습니다.


Int책에서 Swift의 데이터 유형은 아키텍처의 단어 크기와 동일하다고 명시되어 있습니다. NSInteger또한 아키텍처의 단어 크기와 같은 크기입니다.
MaddTheSane 2014-06-05

6

목표 C 유형은 여전히 ​​동적으로 전달되기 때문에 아마도 더 느릴 것입니다. Objective-C API와 상호 작용할 필요가없는 한 Swift 네이티브 유형을 사용하는 것이 가장 좋습니다.


네 그게 바로 답입니다. 그리고 동적으로 디스패치 된 메서드와 개체 변수 액세스를 피하는 것이 WWDC에서 언급 한 이러한 속도 향상의 전부입니다. 과거에는 성능을 걱정하는 모든 사람들이 C ++ 문자열과 컨테이너를 사용하여 정적 디스패치를 ​​얻었습니다.
Lothar

5

가능할 때마다 Swift 기본 유형을 사용하십시오. 그러나 String의 경우 NSString다음과 같은 모든 메소드에 "원활한"액세스 권한 이 있습니다.

var greeting = "Hello!"
var len = (greeting as NSString).length

4

Swift 4 업데이트

String은 swift 4에서 수정을 가져옵니다. 이제 직접 count를 호출 할 수 있으며 이모 지처럼 자소 클러스터를 1 개로 간주합니다. NSString은 업데이트되지 않고 다른 방식으로 계산됩니다.

var nsstring: NSString = "👩‍👩‍👧‍👦"
var string: String = "👩‍👩‍👧‍👦"

print(nsstring.length) // 11
print(string.count)    // 1

1
NSStrings는 아마도 grapheme 클러스터를 다루기 위해 업데이트되지 않을 것입니다. 이것은 예전 동작에 의존하는 너무 많은 앱을 망가뜨릴 것입니다. 또한 NSString.lengthUTF16 문자를 계산합니다.
MaddTheSane

0

문자열은 구조체입니다.

// Swift 모듈에서

공용 구조체 문자열

{

}

NSString은 클래스입니다.

// Foundation Module에서

오픈 클래스 NSString : NSObject

{

}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.