首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Xcode 6具有Swift超慢打字和自动完成功能

Xcode 6具有Swift超慢打字和自动完成功能
EN

Stack Overflow用户
提问于 2014-09-20 18:58:22
回答 11查看 22.9K关注 0票数 116

当你输入你的代码时,特别是在自动完成的情况下,Swift的Xcode6 (6.0.1)似乎是超级慢的

一个普通的Objective-C类,即使在Swift项目中,工作起来几乎和以前一样,所以是Swift杀死了它。

有没有其他人经历过同样的不便?你知道如何提高性能吗?

  • 我尝试过一些设置,但没有成功。
  • 我当然也尝试过重启Xcode和电脑,但没有成功。
  • 没有打开其他繁重的应用程序。

我使用的是2009年中的Macbook Pro (2.26 GHz Intel Core2 Duo),内存8 8GB,固态硬盘硬盘,这不是最新的东西,但仍然不是完全的垃圾。

这是一个遗憾,因为我很兴奋地开始使用Swift,现在真的无法忍受了。

想法/小贴士?

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2014-12-28 02:47:41

不需要退出Xcode并重新启动Mac,但可以在~/Library/Developer/Xcode/DerivedData

  • Delete content
  • ~/Library/Caches/com.apple.dt.Xcode

文件夹的

  • content中找到它

这是一个暂时的解决方案,但效果很好。

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

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

票数 86
EN

Stack Overflow用户

发布于 2014-10-30 08:44:11

在输入一些“简单”代码时,我也体验到了100%+的CPU。一些小技巧,让快速解析器更快,通过你的代码结构。

不要在字符串中使用"+“连接符。对我来说,这很快就会触发速度变慢。每一个新的"+“都会使解析器爬行,每当你在函数体的某个地方添加一个新字符时,解析器都必须重新解析代码。

而不是:

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 )

但是如果我把它放在一个函数中,稍后再调用它,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会更好。如果你不改变图层的.contents,那么CPU基本上是空闲的,但如果你有一个在后台运行的SpriteKit应用程序,那么其他应用程序中的视频播放可能会因为硬性限制的60fps更新循环而开始卡顿。

有时xcode在编译时会显示奇怪的错误,然后它有助于进入菜单"Product > Clean“并重新编译它,这似乎是缓存的一个buggy实现。

当xcode被代码卡住时,另一个改进解析的好方法在另一个stackoverflow post here中提到。基本上,您将.swift文件中的所有内容复制到外部编辑器中,然后逐个函数地将其复制回来,并查看瓶颈所在。这实际上帮助我让xcode再次达到一个合理的速度,在我的项目在100%的CPU下变得疯狂之后。当复制你的代码时,你可以重构它,并尽量保持你的函数体简短,函数/公式/表达式简单(或者拆分成几行)。

票数 13
EN

Stack Overflow用户

发布于 2015-01-29 19:56:26

在苹果决定修复这个两年前的bug之前,不幸的是,唯一的解决方案是在Xcode的首选项上关闭代码完成(下面图片中的第一个选项)。

您可以继续通过在需要时输入CTRL spaceESC来手动完成。

这是唯一一种对100%的情况都有效的解决方案。

我最近发现的另一件事是:如果你在Xcode上使用插件,不要使用,全部删除。它们会让问题变得更糟。

票数 10
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25948024

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档