小编Rom*_*man的帖子

通过应用过滤器去除 nils 后,将类型更改为非可选

let elements: [(Int?, Int?)] = [(1, 2), (2, 1), (3, nil), (nil, 3), (5, 6), (6, 5)]
let result = elements.filter { $0.0 != nil } as! [(Int, Int?)]
Run Code Online (Sandbox Code Playgroud)

有没有更干净的方法来获得部分非可选类型?没有强制解包......
当我们过滤掉 nils 时,编译器应该很明显我们会得到一些非可选的东西。就像我们应用 compactMap 的情况一样。

optional swift swift5

13
推荐指数
1
解决办法
248
查看次数

J:具有特定价值的坐标

假设我们有阵列

0 1 2 3 4 5 8 7 8 9
Run Code Online (Sandbox Code Playgroud)

有两个索引值为8:

(i.10) ([#~8={) 0 1 2 3 4 5 8 7 8 9
6 8
Run Code Online (Sandbox Code Playgroud)

有没有更短的方法来获得这个结果?可能是一些内置动词.

但更重要的是.更高的尺寸呢?假设我们有矩阵5x4

1 2 3 4 5
2 3 4 5 6
3 4 5 6 7
4 5 6 7 8
Run Code Online (Sandbox Code Playgroud)

我想知道什么是值为6的坐标.
我想得到这样的结果(有三个坐标):

4 1
3 2
2 3
Run Code Online (Sandbox Code Playgroud)

这是非常基本的任务,我认为它应该存在一些简单的解决方案.

三维相同?

谢谢

arrays j multidimensional-array

5
推荐指数
2
解决办法
96
查看次数

符合协议时类型别名声明的冗余重复(第 2 部分)

protocol Destinationable: Hashable {
    associatedtype D: Hashable
    var destination: D { get }
}

protocol Graph {
    associatedtype Edge: Destinationable
    subscript(node: D) -> Set<Edge>! { get set }
}

extension Graph {
    typealias D = Edge.D
}

struct UndirectedGraph<Edge: Destinationable>: Graph {
    typealias D = Edge.D // Why should we again declare this typealias!?
    
    private var storage: [D: Set<Edge>]
    
    subscript(node: D) -> Set<Edge>! {
        get { storage[node] }
        set { storage[node] = newValue }
    }
}
Run Code Online (Sandbox Code Playgroud)

这有效。但是,如果我删除typealias D = …

protocols type-alias swift

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

我们应该在哪里使用“Task {}”:在 ViewModel 或 ViewController 中?

假设我们有一些异步代码。在某些时候,我们必须将其包装在 a 中Task {\xe2\x80\xa6},以便从同步上下文运行它。\n那么规范的方法在哪里呢?ViewModel或者ViewController

\n

如果我们用Task {\xe2\x80\xa6}in包装它ViewModelViewModel函数就会变得有效同步,并且调用它们ViewController仍然需要所有这些完成/委托/闭包/RX 在异步工作完成后完成一些 UI 更新。

\n

另一方面,如果我们将ViewModel函数标记为并从主体内部async调用它们,似乎可以解决问题。那么这是一条路吗?ViewControllerTask {\xe2\x80\xa6}

\n

mvvm async-await swift structured-concurrency

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

J语言.我希望以功能的形式表达结果

(+/%#)0:`(>:@$:)@.(3 :'?2')"0 i.10000
Run Code Online (Sandbox Code Playgroud)

像我想的那样工作.答案倾向于1.现在我想以形式表达这个结果

f =: (+/%#)0:`(>:@$:)@.(3 :'?2')"0 i.
f 10000
Run Code Online (Sandbox Code Playgroud)

不行.

j

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

map(keyPath) 其中 keyPath 是一个变量

let arr = [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)]
arr.map(\.0) // [1, 2, 3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

效果很好。但下面的代码无法编译:

let keyPath = \(Int, Int).0
arr.map(keyPath)
Run Code Online (Sandbox Code Playgroud)

无法将类型“WritableKeyPath<(Int, Int), Int>”的值转换为预期参数类型“((Int, Int)) throws -> T”。
无法推断通用参数“T”。

swift keypaths swift5

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

swift 5 中新的“count(where:)”语法的问题

问题是它无法编译。
好像没有这样的语法。
相应的提案被标记为已接受。
他们在几篇值得信赖的文章中使用了该语法:例如此处此视频
上面视频中的确切代码无法编译:

import Foundation

let scores = [100, 80, 85]
let passCount = scores.count { $0 >= 85 }
Run Code Online (Sandbox Code Playgroud)

错误:

无法调用非函数类型“Int”的值

swift swift5

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

以最简单的形式在 map() 中应用 KeyPath

let test = [4, 5, 3, 1, 3]
print(
    test.map { $0 }
)
print(
    test.map(\.self)  // Doesn't compile  
)
Run Code Online (Sandbox Code Playgroud)

错误:

表达类型不明确,没有更多上下文

为什么不起作用?好像应该。
如果不是这样,我们还能如何摆脱这里丑陋的 { $0 } ?

也许用compactMap的例子会更香))

let test = [4, 5, nil, 3, 1, nil, 3]
print(
    test.compactMap { $0 }
)
print(
    test.compactMap(\.self)  // Doesn't compile  
)
Run Code Online (Sandbox Code Playgroud)

错误:

无法将“WritableKeyPath<_, _>”类型的值转换为预期的参数类型“(Int?) throws -> ElementOfResult?”

swift swift5 swift-keypath

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

属性别名(可以说是 Identifiable 最优雅的解决方案)

如果我想遵守协议并且协议定义了我不喜欢的属性名称怎么办?
例如:

struct Currency: Identifiable {
    let id: String
    let rate: Double
}
Run Code Online (Sandbox Code Playgroud)

但在这种情况下,为“id”属性提供一个更有意义的名称会很棒。所以我希望能够做这样的事情:

struct Currency: Identifiable {
    propertyalias iso = id
    let iso: String
    let rate: Double
}
Run Code Online (Sandbox Code Playgroud)

protocols swift

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

类型别名的目的

我想今天我终于明白什么是 typealias 了。

我没有。

我们来看一个例子:

typealias Graph = [String: [String]]

let futurama: Graph = [
    "you": ["bender", "hermes", "scruffy"],
    "bender": ["hubert", "zoidberh"],
    "hermes": ["hubert", "amy", "scruffy"],
    "hubert": ["mom", "fry"],
    "fry": ["leela"],
    "leela": ["brannigan", "nibbler", "scruffy"],
    "amy": ["kif"],
    "brannigan": ["kif"],
    "zoidberh": [],
    "kif": [],
    "mom": [],
    "nibbler": [],
    "scruffy": []
]

extension Graph {
    // Breadth First Search
    func bfs(from start: String, to finish: String) -> [String]? { 
        // Implementation of this graph algorithm here
    }
}

print(
    futurama.bfs(from: "you", to: …
Run Code Online (Sandbox Code Playgroud)

type-alias swift

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

为什么我们在Combine 中没有tryFlatMap 运算符?

我们应该用什么来代替?
我很惊讶以前没有人问过这个问题。

swift combine

0
推荐指数
1
解决办法
475
查看次数