在Objective-C中,您可以区分原子和非原子属性:
@property (nonatomic, strong) NSObject *nonatomicObject;
@property (atomic, strong) NSObject *atomicObject;
Run Code Online (Sandbox Code Playgroud)
根据我的理解,您可以安全地读取和写入从多个线程定义为原子的属性,而同时从多个线程编写和访问非原子属性或ivars可能导致未定义的行为,包括错误的访问错误.
所以如果你在Swift中有这样的变量:
var object: NSObject
Run Code Online (Sandbox Code Playgroud)
我可以安全地并行读取和写入此变量吗?(不考虑这样做的实际意义).
我试图将泛型类型的变量标记为弱:
class X<T> {
weak var t: T?
}
Run Code Online (Sandbox Code Playgroud)
如果我没有提出任何约束T我得到错误weak cannot be applied to non-class type 'T'.
如果我只使用这个与NSObject派生类,这将工作:
class X<T: NSObject> {
weak var t: T?
}
Run Code Online (Sandbox Code Playgroud)
但我也希望能够使用纯Swift类.
对于协议,可以通过使用class关键字要求实现者具有类类型:
protocol ClassType: class {
}
Run Code Online (Sandbox Code Playgroud)
根据ClassType协议,我现在可以将变量标记为弱:
class X<T: ClassType> {
weak var t: T?
}
Run Code Online (Sandbox Code Playgroud)
但我不能class直接将关键字添加到泛型参数:
class X<T: class> { // Compile error
weak var t: T?
}
Run Code Online (Sandbox Code Playgroud)
我可以使协议解决方案适用于具有扩展名的所有NSObject派生类:
extension NSObject: ClassType {
}
Run Code Online (Sandbox Code Playgroud)
但是对于纯Swift类,我没有可以添加此扩展的常见超类.有没有办法让这项工作没有将ClassType协议添加到我想要使用X该类的每个类?例如,泛型参数的一些特殊限定符如class X<T:ThisIsAClass> …
我每晚都下载了最新的Rust,并将此依赖项添加到Cargo.toml:
[dependencies.http]
git = "https://github.com/chris-morgan/rust-http.git"
Run Code Online (Sandbox Code Playgroud)
我收到很多错误cargo build:
...
error: aborting due to 7 previous errors
...
error: aborting due to previous error
Could not compile `regex`.
Run Code Online (Sandbox Code Playgroud)
我想这是因为有些依赖项还没有更新到最新的版本.是否可以从昨天或前一天下载每晚?
已安装的版本:
$ rustc --version
rustc 0.13.0-nightly (c89417130 2015-01-02 21:56:13 +0000)
$ cargo --version
cargo 0.0.1-pre-nightly (1a1868b 2014-12-31 21:39:41 +0000)
Run Code Online (Sandbox Code Playgroud) 在Objective-C中,您可以要求属性的类和其他协议实现:
@property (nonatomic) UIViewController<UISplitViewDelegate> *viewController;
Run Code Online (Sandbox Code Playgroud)
这在Swift中可能吗?从文档中看起来你只需要一个类或一个协议.
当我编辑多个文件时,我经常想在最后编辑的文件之间来回切换.我知道:bn(ext)和:bp(revious)在缓冲区之间切换,但它们不保留上次使用的文件的历史记录.相反,他们使用文件打开的顺序.例如,如果我按此顺序打开文件
A, B, C
Run Code Online (Sandbox Code Playgroud)
我的导航历史记录将是
A, B, C, B
Run Code Online (Sandbox Code Playgroud)
然后:在最后一个缓冲区(B)中的bprevious会将我发送给A.是否有一个命令或插件会将我发送给C?我知道Ctrl-6,但这只在最后两个缓冲区之间切换.我想来回多个缓冲区.
是否可以将 Swift JSON 编码器配置为使用结构体属性的排序顺序作为 JSON 输出中字典键的排序顺序?默认情况下,它使用一些任意(但看似不是随机)的顺序,例如......
struct Example: Codable {
let id: Int
let name: String
let createdAt: Date
let comments: [String]
}
Run Code Online (Sandbox Code Playgroud)
... 结果是 ...
"example" : {
"id" : 1,
"name" : "Test",
"comments" : [
"Comment 1",
"Comment 2"
],
"createdAt" : 549539643.25327206
}
Run Code Online (Sandbox Code Playgroud)
我知道从语义上来说顺序并不重要,但我想保留它以用于调试目的。
这是测试数据模型:
class Item: Identifiable {
let name: String
init( n: Int) {
self.name = "\(n)"
}
}
class Storage: ObservableObject {
@Published var items = [Item( n: 1), Item( n: 2)]
func reverse() {
items = self.items.reversed()
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的内容视图,其中有一个NavigationLink和一个详细视图,其中有一个反转项目顺序的按钮:
struct ContentView: View {
@ObservedObject
var storage = Storage()
var body: some View {
NavigationView {
List {
ForEach( storage.items) { item in
NavigationLink( destination: Button( action: {
self.storage.reverse()
}) {
Text("Reverse")
}) {
Text( item.name).padding()
}
} …Run Code Online (Sandbox Code Playgroud)