---
title: "[译]Swift中的原子属性装饰器"
description: "通过`Property Wrappers`来定义一个原子属性装饰器"
url: "https://hicc.pro/p/blog/atomic-property-wrapper-in-swift"
author: "tyler wang"
published: "2019-09-15T14:32:55.000Z"
updated: "2021-07-03T09:14:20.000Z"
category: "blog"
tags:
  - "翻译"
  - "Swift"
image: "https://image.hicc.pro/pro/20210703171332Fk6_FbFrfTJPpsSyaJ6c8UB6_ahZaXN6p3rinWF3kUivG6XY-.jpg"
lang: "zh-CN"
site: "Hipo日志"
---

# [译]Swift中的原子属性装饰器

## Swift中实现原子属性装饰器
来一篇快文，`Property Wrappers`我姑且叫它“属性装饰器”，是Swift 5.1中新增的最关键的功能，本文不深入解释，先了解的可以[查看Swift 社区SE-0258提议](https://github.com/apple/swift-evolution/blob/master/proposals/0258-property-wrappers.md)。

### 原子、非原子属性

`Objective-C`中的属性默认都是原子的(atomic)。原子的意思是，它支持在不同线程安全的读写。非原子的属性，自然就无法确保这些，但是它的优势是可以快速读取属性。

*原子的属性，在不同的线程中不一定是同义的(synonymous)*

要实现一个原子属性，可以通过锁来实现，在Swift中通过不同的Apple框架的锁都可以实现这点：

![Swfit---](https://image.hicc.pro/hicc_me1979720608_Swfit---.png)

### 通过`Property Wrappers`来定义一个原子的属性装饰器
在此使用`NSLock `来实现原子属性。

```swift
@propertyWrapper
struct Atomic<Value> {

    private var value: Value
    private let lock = NSLock()

    init(wrappedValue value: Value) {
        self.value = value
    }

    var wrappedValue: Value {
      get { return load() }
      set { store(newValue: newValue) }
    }

    func load() -> Value {
        lock.lock()
        defer { lock.unlock() }
        return value
    }

    mutating func store(newValue: Value) {
        lock.lock()
        defer { lock.unlock() }
        value = newValue
    }
}
```

使用的话

```swift
@Atomic var counter: Int = 1
```

---

原文 / Source: <https://hicc.pro/p/blog/atomic-property-wrapper-in-swift>
