Xcode 6与Swift超级慢速打字和自动完成?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (31)

它只是我或Xcode 6(6.0.1)与Swift似乎是超级慢,当你键入你的代码,尤其是自动完成?

即使在Swift项目中,一个普通的Objective-C类的工作方式与之前几乎相同,所以Swift会杀死它。

有没有其他人遇到同样的不便?你对如何提高性能有任何想法吗?

  • 我试图玩一些设置,但没有运气。
  • 我当然也尝试重新启动Xcode和电脑没有运气。
  • 没有其他重型应用程序是开放的

我使用的是2009年中期的MacBook Pro(2.26 GHz Intel Core 2 Duo),配备8GB内存和SSD HD,虽然不是最新的产品,但仍然不是一个完整的垃圾。

想法/提示?

提问于
用户回答回答于
  • 退出Xcode并重新启动Mac不是必需的,但首选。
  • 删除〜/ Library / Developer / Xcode / DerivedData文件夹的内容
  • 删除内容〜/ Library / Caches / com.apple.dt.Xcode

这是一个暂时的解决方案,但功能非常强大。

使用脚本编辑器应用程序的脚本下方

tell application "Terminal"
    do script "rm -frd ~/Library/Developer/Xcode/DerivedData/*"
    do script "rm -frd ~/Library/Caches/com.apple.dt.Xcode/*"
end tell

或者,你可以像这样为你的终端创建一个别名:

alias xcodeclean="rm -frd ~/Library/Developer/Xcode/DerivedData/* && rm -frd ~/Library/Caches/com.apple.dt.Xcode/*"

可以将其添加到您的文件夹中~/.bash_profile,然后xcodeclean在每次要清除这两个文件夹时在命令行上键入。

用户回答回答于

在输入一些“简单”代码时,我也经历了100%+ CPU。一些小巧的技巧可以让您的代码更快速地构建swift-parser。

不要在字符串中使用“+”concatinator。对我来说,这很快就会引起缓慢。每个新的“+”都会使解析器进行爬网,并且每次在函数体中的某处添加新的字符时,都必须重新分析代码。

代替:

var str = "This" + String(myArray.count) + " is " + String(someVar)

使用模板语法,在swift中解析似乎更有效率:

var str = "This \(myArray.count) is \(someVar)"

这样我基本上注意到内联变量“\(*)”在strlen中没有限制。

如果你有计算,使用+ / * - 然后将它们分成较小的部分。

代替:

var result = pi * 2 * radius 

使用:

var result  = pi * 2
    result *= radius

它可能看起来效率较低,但这种快速分析器速度更快。一些公式不会编译,如果它们需要很多操作,即使它们在数学上是正确的。

如果你有一些复杂的计算,然后把它放在一个函数。通过这种方式,解析器可以解析它一次,并且无需在每次更改函数体中的某些内容时重新解析该解析器。

因为如果你的函数体中有一个计算,那么如果类型,语法等仍然正确,那么swift分析器每次都会检查它。如果一条线在计算之上改变,那么计算/公式中的一些变量可能已经改变。如果你把它放在一个外部函数中,那么它将被验证一次,并且swift很高兴它将是正确的,并且不会不断地重新解析它,这会导致高CPU使用率。

通过这种方式,我可以在每次按键时从100%获得低CPU输入。例如,将这3行内联放入你的函数体可以使swiftparser抓取。

let fullPath =  "\(NSHomeDirectory())/Library/Preferences/com.apple.spaces.plist"
let spacesData  = NSDictionary(contentsOfFile: fullPath )! // as Dictionary<String, AnyObject>
let spaces : AnyObject   = spacesData["SpacesDisplayConfiguration"]!["Management Data"]!!["Monitors"]!![0]["Spaces"]!! 

println ( spaces )

但是如果我把它放在func中并稍后调用它,swiftparser会更快

// some crazy typecasting here to silence the parser
// Autodetect of Type from Plist is very rudimentary, 
// so you have to teach swift your types
// i hope this will get improved in swift in future
// would be much easier if one had a xpath filter with
// spacesData.getxpath( "SpacesDisplayConfiguration/Management Data/Monitors/0/Spaces" ) as Array<*> 
// and xcode could detect type from the plist automatically
// maybe somebody can show me a more efficient way to do it
// again to make it nice for the swift parser, many vars and small statements
func getSpacesDataFromPlist() -> Array<Dictionary<String, AnyObject>> {
  let fullPath =  "\(NSHomeDirectory())/Library/Preferences/com.apple.spaces.plist"

  let spacesData  = NSDictionary(contentsOfFile: fullPath )!    as Dictionary<String, AnyObject>
  let sdconfig    = spacesData["SpacesDisplayConfiguration"]    as Dictionary<String, AnyObject>
  let mandata     = sdconfig["Management Data"]                 as Dictionary<String, AnyObject> 
  let monitors    = mandata["Monitors"]                         as Array<Dictionary<String, AnyObject>> 
  let monitor     = monitors[0]                                 as Dictionary<String, AnyObject>
  let spaces      = monitor["Spaces"]                           as Array<Dictionary<String, AnyObject>>

  return spaces
}

func awakeFromNib() {
  ....
  ... typing here ...

  let spaces = self.getSpacesDataFromPlist()
  println( spaces) 
}

Swift和XCode 6.1仍然很麻烦,但如果你遵循这些简单的技巧,编辑代码就会变得可以接受。我更喜欢swift,因为它摆脱了.h文件,并使用更清晰的语法。还有很多类型转换需要像“myVar as AnyObject”那样,但是与复杂的objective-c项目结构和语法相比,这是更小的恶意。

另一个经验,我尝试了SpriteKit,使用起来很有趣,但是如果你不需要在60fps下不断进行重绘,那么它效率很高。如果你的“精灵”不经常改变,使用旧的CALayers对于CPU来说会更好。如果你没有改变图层的内容,那么CPU基本上是空闲的,但是如果你有一个SpriteKit应用程序在后台运行,那么其他应用程序中的视频播放可能会由于60fps的更新循环而出现断断续续的现象。

有时xcode会在编译时显示奇怪的错误,那么它有助于进入菜单“产品>清理”并再次编译,似乎是缓存的一个错误的实现。

基本上,可以将.swift文件中的所有内容复制到外部编辑器中,然后通过函数功能将其复制并查看瓶颈。这实际上帮助我在xcode恢复到合理的速度后,在我的项目100%CPU疯狂后。在将代码复制回来时,可以对其进行重构,并尽量保持函数体的简短性,并简化函数/公式/表达式(或分成几行)。

扫码关注云+社区