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

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

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

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

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



답변

가능할 때마다 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 데이터 유형 작업을 참조하십시오 .


답변

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 유형에서 수행 할 수있는 모든 작업을 수행 할 수 있습니다.

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


답변

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

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

nsstring.length
count(string)

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

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


답변

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

let s = "hello" as NSString

또는

let s: NSString  = "hello"

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

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

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


답변

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


답변

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

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


답변

Swift 4 업데이트

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

var nsstring: NSString = "?‍?‍?‍?"
var string: String = "?‍?‍?‍?"

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