我正在使用Xcode 6 Beta 6.
这是一段时间以来一直困扰着我的事情,但现在已经达到了几乎无法使用的程度.
我的项目开始有一个相当大的65个Swift文件和一些桥接的Objective-C文件(这实际上不是问题的原因).
似乎对任何Swift文件的任何轻微修改(比如在应用程序中几乎不使用的类中添加简单的空格)将导致重新编译指定目标的整个Swift文件.
经过深入调查后,我发现占用编译器时间的几乎100%是CompileSwift
Xcode在swiftc
目标的所有Swift文件上运行命令的阶段.
我做了一些进一步的调查,如果我只使用默认控制器保持app委托,编译速度非常快,但随着我添加越来越多的项目文件,编译时间开始变得非常慢.
现在只有65个源文件,每次编译大约需要8/10秒.根本不是很快.
我还没有看到任何帖子在谈论除了这个问题这一个,但它是一个旧版本的Xcode 6.所以我想知道如果我在这种情况下,唯一的一个.
UPDATE
我在GitHub上检查了一些像Alamofire,Euler和CryptoSwift的 Swift项目,但没有一个项目有足够的Swift文件来实际比较.我找到的唯一一个大小合适的项目是SwiftHN,即使它只有十几个源文件,我仍然可以验证相同的东西,一个简单的空间和整个项目需要重新编译,这开始采取一个很少的时间(2/3秒).
与Objective-C代码相比,分析器和编译都非常快,这真的感觉Swift永远无法处理大型项目,但请告诉我我错了.
使用Xcode 6 Beta 7进行更新
仍然没有任何进步.这开始变得荒谬了.由于缺乏#import
Swift,我真的不知道Apple将如何能够优化它.
更新使用Xcode 6.3和Swift 1.2
Apple已添加增量构建(以及许多其他编译器优化).您必须将代码迁移到Swift 1.2以查看这些优势,但Apple在Xcode 6.3中添加了一个工具来帮助您:
然而
不要像我一样快乐.他们用来制作构建增量的图解算器还没有很好地优化.
实际上,首先,它不会查看函数签名更改,因此如果在一个方法的块中添加空格,则将重新编译依赖于该类的所有文件.
其次,它似乎根据重新编译的文件创建树,即使更改不影响它们.例如,如果将这三个类移动到不同的文件中
class FileA: NSObject {
var foo:String?
}
class FileB: NSObject {
var bar:FileA?
}
class FileC: NSObject {
var baz:FileB?
}
Run Code Online (Sandbox Code Playgroud)
现在,如果你修改FileA
,编译器显然会标记 …
无论如何都要[NSString stringWithFormat:@"%p", myVar]
用新的快速语言模拟代码?
例如:
let str = "A String"
println(" str value \(str) has address: ?")
Run Code Online (Sandbox Code Playgroud) 当我正在玩一个快速的教程时,我开始编写一个自定义isPrime
方法来检查给定Int
是否为素数.
在写完之后,我意识到它工作正常,但发现它isPrime
在某些相当大的数字上执行有点慢(当时仍然低得多Int.max
).
所以我在objc中编写了相同的代码片段,代码执行得更快(66倍).
这是快速代码:
class Swift {
class func isPrime(n:Int) -> Bool {
let sqr : Int = Int(sqrt(Double(n))) + 1
for i in 2...sqr {
if n % i == 0 {
return false
}
}
return true;
}
class func primesInRange(start:Int, end:Int) -> Int[] {
var primes:Int[] = Int[]()
for n in start...end {
if self.isPrime(n) {
primes.append(n)
}
}
return primes;
}
}
Run Code Online (Sandbox Code Playgroud)
和objc代码:
@implementation Utils
+ …
Run Code Online (Sandbox Code Playgroud) 我知道这看起来像一个简单的问题,可以简单地说:
webview.scrollView.scrollEnabled = NO;
webview.scrollView.panGestureRecognizer.enabled = NO;
webview.scrollView.bounces = NO;
Run Code Online (Sandbox Code Playgroud)
甚至
for (UIView* subview in webview.subviews) {
if ([subview respondsToSelector:@selector(setScrollEnabled:)]) {
[(id)subview setScrollEnabled:enabled];
}
if ([subview respondsToSelector:@selector(panGestureRecognizer)]) {
[[(id)subview panGestureRecognizer] setEnabled:enabled];
}
}
Run Code Online (Sandbox Code Playgroud)
虽然它确实防止了contentOffset
内部的scolling(在意义上),但WKWebview
它并没有阻止它接收涉及滚动的平移手势事件.
因此,当用户向左或向右滚动时,包含javascript以自动更改文章的Huffington Post的文章仍然会得到该行为.
我怎么能阻止这个?
在Kotlin中,当一个类有多个构造函数时,我们如何在另一个构造函数中调用指定的(来自iOS世界,我找不到更好的名称)构造函数.
让我举个例子
final class LoadingButton: LinearLayout {
var text:String? = null
constructor(context: Context, text: String) : this(context) {
this.text = text
}
constructor(context: Context) : super(context) {
val t = this.text
this.view {
button(t) { /* ... */}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这里,如果我这样做loadingButton("TEST", {})
,那个字符串不会传播到按钮,因为this(context)
在方便构造函数中的代码之前调用(再次抱歉:).
可以在Kotlin解决吗?就像是
constructor(context: Context, text: String) {
this.text = text
this(context)
}
Run Code Online (Sandbox Code Playgroud)
编辑
只是为了澄清这个想法,因为它被问到,想法是在一个活动中写这样的东西:
onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
verticalLayout {
loadingButton("Some text")
//or
loadingButton() { this.text = "Some text"}
} …
Run Code Online (Sandbox Code Playgroud) 虽然有很多文档和示例在XCode 3中创建模板,将它们转换为XCode4模板是一个噩梦......
首先,这是我发现的:
但他们都没有回答这个样本问题:
有谁可以创建文件夹内幕其他文件夹?
例如,如果您想在组中包含文件,则应编写:
<key>Definitions</key>
<dict>
<key>File1.h</key>
<dict>
<key>Group</key>
<string>Group1</string>
<key>Path</key>
<string>File1.h</string>
<key>TargetIndices</key>
<array/>
</dict>
<key>File1.m</key>
<dict>
<key>Group</key>
<string>Group1</string>
<key>Path</key>
<string>File1.m</string>
</dict>
</dict>
<key>Nodes</key>
<array>
<string>File1.h</string>
<string>File1.m</string>
</array>
Run Code Online (Sandbox Code Playgroud)
但是你如何在Group2中使用Group1呢?
我尝试了许多东西,与祖先玩耍,但除了一切都没有用之外.任何建议或任何文档(我在这些XCode模板上找不到任何文档)将不胜感激.
假设我有一个现有的iOS或Mac框架,我们称之为Test.framework.这个框架已成功编译和链接(为iOS部分提供了i386和armv6/7 archs的技巧)并且工作得非常好.
现在我想添加一个图像让我们称之为' test.png
'.我已将其复制到我的框架的Resources文件夹中,以便我具有以下结构:
ls Test.framework
- Headers -> Versions/Current/Headers
- Resources -> Versions/Current/Resources
- Test -> Versions/Current/Test
- Versions
ls Test.framework/Resources
- Info.plist
- test.png
Run Code Online (Sandbox Code Playgroud)
然而,当我使用我的框架创建项目时,我无法访问该图像.
我试过了:
[UIImage imageNamed:@"test.png"]
[UIImage imageNamed:@"Test.framework/test.png"]
[UIImage imageNamed:@"Test.framework/Resources/test.png"]
Run Code Online (Sandbox Code Playgroud)
但没有任何成功,总能给我一个nil
对象.
有任何想法吗 ?
编辑
经过进一步的调查后,似乎我想要实现的目标无法在iOS上完成.原因是最终的应用程序包(.app)不会复制为Mac OS编译的应用程序所在的私有框架.
这在iOS Bundle Structures文档中进一步详细说明.
感谢Rob Keniger和xuzhe对他们的赞赏.我会赞扬xuzhe的答案,因为它实际上是我最初问题的最合适的答案(尽管Rob评论让我深入研究了这个问题)
swift ×3
ios ×2
anko ×1
cocoa ×1
compilation ×1
kotlin ×1
objective-c ×1
performance ×1
primes ×1
webview ×1
xcode ×1
xcode4 ×1