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 的情况一样。
假设我们有阵列
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)
这是非常基本的任务,我认为它应该存在一些简单的解决方案.
三维相同?
谢谢
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 = …
假设我们有一些异步代码。在某些时候,我们必须将其包装在 a 中Task {\xe2\x80\xa6},以便从同步上下文运行它。\n那么规范的方法在哪里呢?ViewModel或者ViewController?
如果我们用Task {\xe2\x80\xa6}in包装它ViewModel,ViewModel函数就会变得有效同步,并且调用它们ViewController仍然需要所有这些完成/委托/闭包/RX 在异步工作完成后完成一些 UI 更新。
另一方面,如果我们将ViewModel函数标记为并从主体内部async调用它们,似乎可以解决问题。那么这是一条路吗?ViewControllerTask {\xe2\x80\xa6}
(+/%#)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)
不行.
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”。
问题是它无法编译。
好像没有这样的语法。
但相应的提案被标记为已接受。
他们在几篇值得信赖的文章中使用了该语法:例如此处和此视频。
上面视频中的确切代码无法编译:
import Foundation
let scores = [100, 80, 85]
let passCount = scores.count { $0 >= 85 }
Run Code Online (Sandbox Code Playgroud)
错误:
无法调用非函数类型“Int”的值
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?”
如果我想遵守协议并且协议定义了我不喜欢的属性名称怎么办?
例如:
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) 我想今天我终于明白什么是 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)