今天我正在编写一个应用程序,需要将一些Double
更正为一些有效的数字/数字(sig fig)。用户可以设置号码。 sig fig转换为。我将这条信息存储在NSUserDefaults
。
我创建了一个枚举来表示这些设置,因为我想让我的代码更具可读性,而不仅仅是普通的旧整数。这是枚举:
enum SigFigOptions{
case No
case Yes(Int)
}
如果是.No
,则数字将是准确的。如果是.Yes
,则会更正数字。并且sig fig的数量存储在相关值中。
然后我在枚举中创建了一个名为correctTo
的方法。
func correctTo (i: Double) -> Double {
if self == .No {
}
}
当我写这篇文章的时候,我看到有一个语法错误,说这是不明确的。所以我把它改成了:
if self == SigFigOptions.No
但后来它说==
不能用于两种SigFigOptions
类型。
switch
来执行此操作。但我认为在有很多案例时应该使用switch
。在这种情况下,我认为最好使用if语句来增强可读性。但我无法比较它们!
您能告诉我如何使用if语句比较枚举吗?
哦顺便说一句,如果你知道算法来纠正某个sig的数字。请好好向我展示。
答案 0 :(得分:18)
您可以使用图案装订:private readonly ConcurrentDictionary<string, SemaphoreSlim> _keyLocks = new ConcurrentDictionary<string, SemaphoreSlim>();
private readonly ConcurrentDictionary<string, Store> _cache = new ConcurrentDictionary<string, Store>();
public async Task<Store> GetStoreByUsernameAsync(string username)
{
Store value;
// get the semaphore specific to this username
var keyLock = _keyLocks.GetOrAdd(username, x => new SemaphoreSlim(1));
await keyLock.WaitAsync().ConfigureAwait(false);
try
{
// try to get Store from cache
if (!_cache.TryGetValue(username, out value))
{
// if value isn't cached, get it from the DB asynchronously
value = await _storeRepository.GetSingleAsync(x => x.UserName == username).ConfigureAwait(false);
// cache value
_cache.TryAdd(username, value);
}
}
finally
{
keyLock.Release();
}
return value;
}