이것은 허용되는 답변과 거의 동일하지만 대화가 추가되었습니다 (Rob Napier, 그의 다른 답변 및 Matt, Oliver, Slack의 David와의 대화) 및 링크가 있습니다.
이 토론 의 의견을 참조하십시오 . 그것의 요지는 :
+
과도하게 과부하되었습니다 (Apple은 경우에 따라이 문제를 해결 한 것으로 보입니다)
+
연산자는 당신이 4 문자열 즉 합치되도록 경우 27 개 다른 기능을 가지고 현재로서는 크게는 3 개가, 과부하 +
컴파일러가하는 사업자 확인 즉 27 ^ 3 번, 그래서 27 개 사업자마다 사이를. 그러나 그것은 아닙니다.
도있다 체크 있는지 lhs
와 rhs
의 +
기능들이는 핵심에 통해 호출하는 경우 모두 유효 append
라고는. 거기에서 발생할 수있는 다소 집중적 인 검사 가 많이 있습니다. 문자열이 비 연속적으로 저장되는 경우 다루는 문자열이 실제로 NSString에 브리지 된 경우에 해당됩니다. 그런 다음 Swift는 모든 바이트 배열 버퍼를 하나의 연속 된 버퍼로 다시 어셈블해야하며 그 과정에서 새 버퍼를 만들어야합니다. 그런 다음 결국 연결하려고하는 문자열이 포함 된 하나의 버퍼를 얻습니다.
간단히 말해 3 개의 컴파일러 검사 클러스터가있어 속도가 느려집니다. 즉, 각 하위 표현식을 반환 할 수 있는 모든 것을 고려하여 다시 고려해야 합니다. 결과적으로 보간으로 문자열을 연결하는 것, 즉 보간에 과부하 가 없기 때문에 사용하는 " My fullName is \(firstName) \(LastName)"
것이 훨씬 낫습니다."My firstName is" + firstName + LastName
Swift 3 는 일부 개선되었습니다. 자세한 내용 은 컴파일러 속도를 늦추지 않고 여러 배열을 병합하는 방법을 참조하십시오 . . 그럼에도 불구하고 +
연산자는 여전히 과부하 상태이며 더 긴 문자열에는 문자열 보간을 사용하는 것이 좋습니다
옵션 사용 (계속되는 문제-사용 가능한 솔루션)
이 매우 간단한 프로젝트에서 :
import UIKit
class ViewController: UIViewController {
let p = Person()
let p2 = Person2()
func concatenatedOptionals() -> String {
return (p2.firstName ?? "") + "" + (p2.lastName ?? "") + (p2.status ?? "")
}
func interpolationOptionals() -> String {
return "\(p2.firstName ?? "") \(p2.lastName ?? "")\(p2.status ?? "")"
}
func concatenatedNonOptionals() -> String {
return (p.firstName) + "" + (p.lastName) + (p.status)
}
func interpolatedNonOptionals() -> String {
return "\(p.firstName) \(p.lastName)\(p.status)"
}
}
struct Person {
var firstName = "Swift"
var lastName = "Honey"
var status = "Married"
}
struct Person2 {
var firstName: String? = "Swift"
var lastName: String? = "Honey"
var status: String? = "Married"
}
함수의 컴파일 시간은 다음과 같습니다.
21664.28ms /Users/Honey/Documents/Learning/Foundational/CompileTime/CompileTime/ViewController.swift:16:10 instance method concatenatedOptionals()
2.31ms /Users/Honey/Documents/Learning/Foundational/CompileTime/CompileTime/ViewController.swift:20:10 instance method interpolationOptionals()
0.96ms /Users/Honey/Documents/Learning/Foundational/CompileTime/CompileTime/ViewController.swift:24:10 instance method concatenatedNonOptionals()
0.82ms /Users/Honey/Documents/Learning/Foundational/CompileTime/CompileTime/ViewController.swift:28:10 instance method interpolatedNonOptionals()
컴파일 지속 시간이 얼마나 큰지 주목하십시오 concatenatedOptionals
.
다음을 수행하여 해결할 수 있습니다.
let emptyString: String = ""
func concatenatedOptionals() -> String {
return (p2.firstName ?? emptyString) + emptyString + (p2.lastName ?? emptyString) + (p2.status ?? emptyString)
}
컴파일 88ms
문제의 근본 원인은 컴파일러가 식별하지 않는다는 것입니다 ""
A와 String
. 실제로ExpressibleByStringLiteral
컴파일러는 볼 수 ??
와 할 것이다 이 프로토콜을 본 모든 종류의를 통해 루프 가에 기본이 될 수있는 유형을 발견까지, String
. emptyString
를로 코딩 하여 를 사용 String
하면 컴파일러는 더 이상 모든 일치 유형을 반복 할 필요가 없습니다.ExpressibleByStringLiteral
컴파일 시간을 기록하는 방법을 알아 보려면 여기 또는 여기를 참조 하십시오
SO에 Rob Napier의 다른 유사한 답변 :
왜 문자열 추가에 시간이 오래 걸립니까?
컴파일러 속도를 늦추지 않고 여러 배열을 병합하는 방법은 무엇입니까?
스위프트 어레이는 빌드 시간을 길게하는 기능을 포함합니다.
var statement = "create table if not exists \(self.tableName()) (\(columns))"
?