小编Pal*_*tim的帖子

在Swift中列出理解

语言指南没有透露列表理解的痕迹.在Swift中实现这一目标的最佳方法是什么?我正在寻找类似的东西:

evens = [ x for x in range(10) if x % 2 == 0]
Run Code Online (Sandbox Code Playgroud)

list-comprehension swift

43
推荐指数
2
解决办法
1万
查看次数

Peek和Pop不是一个选择

我正在尝试将Peek和Pop应用到应用程序中.只有一个问题 - 我目前的segue设置没有选项:

Segue Setup

我做错了什么,为什么我没有这个选择?

ios segue xcode-storyboard swift

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

使用javascript将工作表添加到excel文件

假设我有3张桌子.我想将3个工作表(每页一个表)中的表插入到一个excel文件中(不需要ActiveXObject)

在此输入图像描述

我尝试了下面的代码,但它只创建了一个工作表

var tableToExcel = (function () {
    var uri = 'data:application/vnd.ms-excel;base64,',
        template = '<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="http://www.w3.org/TR/REC-html40"><head><!--[if gte mso 9]><xml><x:ExcelWorkbook><x:ExcelWorksheets><x:ExcelWorksheet><x:Name>{worksheet}</x:Name><x:WorksheetOptions><x:DisplayGridlines/></x:WorksheetOptions></x:ExcelWorksheet></x:ExcelWorksheets></x:ExcelWorkbook></xml><![endif]--></head><body><table>{table}</table><table>{table}</table></body></html>',
        base64 = function (s) {
            return window.btoa(unescape(encodeURIComponent(s)))
        }, format = function (s, c) {
            return s.replace(/{(\w+)}/g, function (m, p) {
                return c[p];
            })
        }
    return function (table, name) {
        if (!table.nodeType) table = document.getElementById(table)
        var ctx = {
            worksheet: name || 'Worksheet',
            table: table.innerHTML
        }
        window.location.href = uri + base64(format(template, ctx))
    }
})();
Run Code Online (Sandbox Code Playgroud)

javascript excel

5
推荐指数
1
解决办法
1万
查看次数

Swift 4.2 - 返回在函数内创建的类

我想声明一个工厂来帮助我创建用于测试的单例类的实例,而无需在测试运行之间清除类级状态的开销。我的想法是使用工厂返回在函数内声明的类。

我的假设是该类将在运行中创建,并且仅在返回的引用被维护时才会保留。例如:

protocol TestClassFactory {
    static func make() -> TestClass.Type
}

protocol TestClass {
    static var testValue: String { get set }
}

class Factory: TestClassFactory {
    static func make() -> TestClass.Type {
        class Tester: TestClass {
            static var testValue = "Unmodified"
        }

        return Tester.self
    }
}
Run Code Online (Sandbox Code Playgroud)

然而,在实践中,这并没有按预期工作。具体来说,在第一个make()返回值上设置的静态值会保留到第二个返回值中。

var testClass1 = Factory.make()
print(testClass1.testValue)        // "Unmodified"
testClass1.testValue = "Modified"
print(testClass1.testValue)        // "Modified"

var testClass2 = Factory.make()
print(testClass2.testValue)        // "Modified" 
Run Code Online (Sandbox Code Playgroud)

Swift 运行时似乎保留了类,就像在编译时声明和引用的类一样。

我的问题:

  1. 有没有人有描述这种行为是否有意的参考资料?我认为是,但想确定。
  2. 对于我的特定用例,除了使用某种反射/镜像来动态生成类型之外,我还有其他选择吗?

swift

5
推荐指数
1
解决办法
312
查看次数

使用结构化并发测试并行执行

I\xe2\x80\x99m 测试使用 actor 的代码,并且 I\xe2\x80\x99d 喜欢测试 I\xe2\x80\x99m 是否正确处理并发访问和重入。我常用的方法之一是用来DispatchQueue.concurrentPerform触发来自不同线程的一堆请求,并确保我的值按预期解析。但是,由于参与者使用结构化并发,因此 I\xe2\x80\x99m 不确定如何实际等待任务完成。

\n

我\xe2\x80\x99d 喜欢做的是这样的:

\n
let iterationCount = 100\nlet allTasksComplete = expectation(description: "allTasksComplete")\nallTasksComplete.expectedFulfillmentCount = iterationCount\nDispatchQueue.concurrentPerform(iterations: iterationCount) { _ in\n    Task {\n        // Do some async work here, and assert\n        allTasksComplete.fulfill()\n    }\n}\nwait(for: [allTasksComplete], timeout: 1.0)\n
Run Code Online (Sandbox Code Playgroud)\n

然而,期望的超时allTasksComplete每次都会到期,无论迭代计数是 1 还是 100,也无论超时的长度如何。I\xe2\x80\x99m 假设这与混合结构化并发和 DispatchQueue 式并发是禁忌有关?

\n

如何正确测试并发访问 \xe2\x80\x94 特别是如何保证从不同线程访问参与者,并等待测试完成直到满足所有期望?

\n

concurrency xctest swift

3
推荐指数
1
解决办法
959
查看次数