2016-05-09 3 views
0

Есть ли способ шаблонов вычисляемых свойств, чтобы избежать повторения одного и того же кода снова и снова? Например, прямо сейчас у меня есть класс с блоком кода, который выглядит следующим образом:Шаблоны с быстрым вычислением?

private var _state:State? 
private var _maxs:State? 
private var _state1s:State? 
private var _state10s:State? 

var state:State? { 
    get { 
     dispatch_semaphore_wait(statephore, DISPATCH_TIME_FOREVER) 
     let s=_state 
     dispatch_semaphore_signal(statephore) 
     return s 
    } 
    set { 
     dispatch_semaphore_wait(statephore, DISPATCH_TIME_FOREVER) 
     _state=newValue 
     dispatch_semaphore_signal(statephore) 
     if newValue != nil {statsTest(newValue!)} 
    } 
} 

var maxs:State? { 
    get { 
     dispatch_semaphore_wait(maxphore, DISPATCH_TIME_FOREVER) 
     let m=_maxs 
     dispatch_semaphore_signal(maxphore) 
     return m 
    } 
    set { 
     dispatch_semaphore_wait(maxphore, DISPATCH_TIME_FOREVER) 
     _maxs=newValue 
     dispatch_semaphore_signal(maxphore) 
    } 
} 


var state1s:State? { 
    get { 
     dispatch_semaphore_wait(state1sphore, DISPATCH_TIME_FOREVER) 
     let s=_state1s 
     dispatch_semaphore_signal(state1sphore) 
     return s 
    } 
    set { 
     dispatch_semaphore_wait(state1sphore, DISPATCH_TIME_FOREVER) 
     _state1s=newValue 
     dispatch_semaphore_signal(state1sphore) 
    } 
} 

var state10s:State? { 
    get { 
     dispatch_semaphore_wait(state10sphore, DISPATCH_TIME_FOREVER) 
     let s=_state10s 
     dispatch_semaphore_signal(state10sphore) 
     return s 
    } 
    set { 
     dispatch_semaphore_wait(state10sphore, DISPATCH_TIME_FOREVER) 
     _state10s=newValue 
     dispatch_semaphore_signal(state10sphore) 
    } 
} 

Там очевидная картина здесь, и все повторяется код только запутывает то, что происходит, и привела к ошибкам, как я вырезано/вставить/редактировать/незачет. Есть ли способ захватить этот шаблон, а затем определить мои свойства с чем-то вроде:

var state=ProtectedValue(_state,statephore) 

?

+0

Вам не нужно будет семафоров в ваших добытчиками, поскольку нет никакого конфликта ресурсов, чтобы предотвратить. – Alexander

+0

Поведение может появиться в Swift 3 (см. Https://github.com/apple/swift-evolution/blob/master/proposals/0030-property-behavior-decls.md) – Kevin

+0

@AMomchilov, в этом случае это состояние разделяемые асинхронными очередями, поэтому интерфейс должен быть защищен. Все еще изучая, если это лучший способ справиться с этим, но мой вопрос состоит в том, что эта идея нескольких свойств, имеющих почти одинаковые шаблоны доступа, выглядит так, будто она часто возникает. – Omegaman

ответ

1

Это похоже на работу для дженериков и inout переменных.

func setProtectedValue<T>(inout destination: T, newValue: T, semaphore: SemaphoreType) { 
     dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER) 
     destination = newValue 
     dispatch_semaphore_signal(semaphore) 
} 

на месте вызова:

var state10s:State? { 
    get { 
     //... 
    } 
    set { 
     setProtectedValue(&_state10s, newValue, state10sphore) 
    } 
} 
+0

Убивает, я случайно помещал в '_state10s =', где он не принадлежал. См. Мой обновленный ответ. Он должен вызывать только 1 ожидание на вызов сеттера. – Alexander

+0

Спасибо, все еще не так чисто, как хотелось бы, но, вероятно, так близко, как я доберусь до тех пор, пока не появятся поведения или что-то подобное. – Omegaman

+0

Я бы сделал общую структуру, которая инкапсулирует семафор и данные, которые он защищает. – Alexander