小编apo*_*che的帖子

为什么Swift编译时间这么慢?

我正在使用Xcode 6 Beta 6.

这是一段时间以来一直困扰着我的事情,但现在已经达到了几乎无法使用的程度.

我的项目开始有一个相当大的65个Swift文件和一些桥接的Objective-C文件(这实际上不是问题的原因).

似乎对任何Swift文件的任何轻微修改(比如在应用程序中几乎不使用的类中添加简单的空格)将导致重新编译指定目标的整个Swift文件.

经过深入调查后,我发现占用编译器时间的几乎100%是CompileSwiftXcode在swiftc目标的所有Swift文件上运行命令的阶段.

我做了一些进一步的调查,如果我只使用默认控制器保持app委托,编译速度非常快,但随着我添加越来越多的项目文件,编译时间开始变得非常慢.

现在只有65个源文件,每次编译大约需要8/10秒.根本不是很快.

我还没有看到任何帖子在谈论除了这个问题这一个,但它是一个旧版本的Xcode 6.所以我想知道如果我在这种情况下,唯一的一个.

UPDATE

我在GitHub上检查了一些像Alamofire,EulerCryptoSwift的 Swift项目,但没有一个项目有足够的Swift文件来实际比较.我找到的唯一一个大小合适的项目SwiftHN,即使它只有十几个源文件,我仍然可以验证相同的东西,一个简单的空间和整个项目需要重新编译,这开始采取一个很少的时间(2/3秒).

与Objective-C代码相比,分析器和编译都非常快,这真的感觉Swift永远无法处理大型项目,但请告诉我我错了.

使用Xcode 6 Beta 7进行更新

仍然没有任何进步.这开始变得荒谬了.由于缺乏#importSwift,我真的不知道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,编译器显然会标记 …

compilation swift

201
推荐指数
11
解决办法
4万
查看次数

在swift中打印可变内存地址

无论如何都要[NSString stringWithFormat:@"%p", myVar]用新的快速语言模拟代码?

例如:

let str = "A String"
println(" str value \(str) has address: ?")
Run Code Online (Sandbox Code Playgroud)

swift

141
推荐指数
13
解决办法
7万
查看次数

斯威夫特在处理数字方面真的很慢吗?

当我正在玩一个快速的教程时,我开始编写一个自定义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)

performance primes swift

35
推荐指数
2
解决办法
4691
查看次数

如何在WKWebView中完全禁用滚动?

我知道这看起来像一个简单的问题,可以简单地说:

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的文章仍然会得到该行为.

我怎么能阻止这个?

webview ios

17
推荐指数
4
解决办法
2万
查看次数

在Kotlin中调用另一个默认构造函数

在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)

kotlin anko

9
推荐指数
1
解决办法
5535
查看次数

在XCode 4模板中创建子组

虽然有很多文档和示例在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模板上找不到任何文档)将不胜感激.

xcode xcode4

7
推荐指数
1
解决办法
4334
查看次数

将图像(或其他资源)添加到Mac或iOS Framework

假设我有一个现有的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评论让我深入研究了这个问题)

cocoa objective-c ios

7
推荐指数
1
解决办法
6514
查看次数

标签 统计

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