Bu neredeyse kabul edilen cevapla aynı ama bazı ek diyaloglarla (Rob Napier, diğer cevapları ve Matt, Oliver, David, Slack ile) ve bağlantılarla.
Bu tartışmadaki yorumlara bakın . Bunun özü:
+
aşırı yüklenmiş (Apple bazı durumlarda bunu düzeltmiş gibi görünüyor)
+
Operatör size 4 dizeleri yani birleştirerek yüzden eğer 27 farklı işlevlere sahiptir bugün itibariyle ağır sen 3 var, aşırı yüklendi +
derleyici zorundadır operatörleri kontrol o 27 ^ 3 kez bu yüzden, 27 operatörler her zaman arasındadır. Ama bu değil.
Bir de bulunmaktadır onay olmadığını görmek için lhs
ve rhs
bir +
fonksiyonlarına onlar çekirdeği içinden çağrıları ise hem geçerlidir append
denir. Orada meydana gelebilecek biraz yoğun kontroller olduğunu görebilirsiniz. Dize bitişik olmayan bir şekilde depolanırsa, ele aldığınız dize aslında NSString ile köprülenirse durum böyle görünür. Swift daha sonra tüm bayt dizi tamponlarını tek bir bitişik tamponda yeniden birleştirmek zorundadır ve bu da yol boyunca yeni tamponlar oluşturmayı gerektirir. ve sonunda bir araya getirmeye çalıştığınız dizeyi içeren bir arabellek alırsınız.
Özetle, yani sizi yavaşlatır derleyici çeklerin 3 kümeleri vardır her alt ifadesi her şeyin ışık tekrar düşünülmesi gerekir olabilir dönmek . Sonuç olarak, enterpolasyon ile dizeleri birleştirmek, yani enterpolasyonun aşırı yüklenmesi olmadığından" My fullName is \(firstName) \(LastName)"
çok daha iyidir"My firstName is" + firstName + LastName
Swift 3 yaptı bazı iyileştirmeler. Daha fazla bilgi için Derleyiciyi yavaşlatmadan birden çok Diziyi nasıl birleştirebilirim? Başlıklı konuyu okuyun. . Bununla birlikte, +
operatör hala aşırı yüklenmiş ve daha uzun dizeler için dize enterpolasyonu kullanmak daha iyidir
Opsiyonel kullanım (devam eden problem - çözüm mevcut)
Bu çok basit projede:
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"
}
Fonksiyonlar için derleme zamanı şöyledir:
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()
Derleme süresinin ne kadar çılgın olduğuna dikkat edin concatenatedOptionals
.
Bu, şu şekilde çözülebilir:
let emptyString: String = ""
func concatenatedOptionals() -> String {
return (p2.firstName ?? emptyString) + emptyString + (p2.lastName ?? emptyString) + (p2.status ?? emptyString)
}
hangi derler 88ms
Sorunun temel nedeni, derleyicinin ""
bir String
. AslındaExpressibleByStringLiteral
Derleyici, varsayılan olabilen bir tür bulana kadar bu protokole uyan tüm türleri görecek ??
ve bu döngüler arasında döngü yapacaktır String
. Kullanarak emptyString
için kodlanmış olan String
, derleyici artık tüm uygun türleri arasında döngü gerekiyorExpressibleByStringLiteral
Derleme sürelerinin nasıl günlüğe kaydedileceğini öğrenmek için buraya veya buraya bakın
Rob Napier on SO diğer benzer cevaplar:
Dize eklemenin oluşturulması neden bu kadar uzun sürüyor?
Derleyiciyi yavaşlatmadan çoklu Diziler nasıl birleştirilir?
Swift Array, oluşturma sürelerini uzatan bir işlev içerir
var statement = "create table if not exists \(self.tableName()) (\(columns))"
?