2015-08-12 3 views
1

Я пытаюсь создать оболочку вокруг функций IOS OSTestAndSet() и OSTestAndClear() для использования с атомным логического типа на основе следующих GitHub code:Swift атомная булева

class AtomicBoolean { 

    private var val: Byte = 0 

    /// Sets the value, and returns the previous value. 
    /// The test/set is an atomic operation. 
    func testAndSet(value: Bool) -> Bool { 
     if value { 
      return OSAtomicTestAndSet(0, &val) 
     } else { 
      return OSAtomicTestAndClear(0, &val) 
     } 
    } 

    /// Returns the current value of the boolean. 
    /// The value may change before this method returns. 
    func test() -> Bool { 
     return val != 0 
    } 

} 

Однако я получаю ошибку компилятора для декларации собственности, которая гласит: Use of undeclared type 'Byte'; did you mean to use 'UInt8'?

В настоящее время я импортирую Фонд для этого файла кода. Я видел, что другие записи stackoverflow используют тип Byte, но я не смог найти, почему это не доступно в моем случае.

Я использую следующую версию Swift: компании Apple Swift версии 1.2 (swiftlang-602.0.53.1 лязг-602.0.53)

Кроме того, если изменить тип данных, чтобы Uint8, как компилятор предполагает, я получают дополнительные ошибки в вызовах OSAtomicTestAndSet() и OSAtomicTestAndClear(), которые заявляют следующее: Cannot assign to immutable value of type 'UInt8', несмотря на то, что я использую объявление var, а не let.

+0

'Byte' был удален как typealias в Swift 1.2 (я думаю, и не раньше). Вместо этого используйте 'UInt8'. Я не вижу вашу вторую ошибку в Xcode 6.4 (Swift 1.2). – vacawama

+0

@vacawama Спасибо. Для второй ошибки я пытался определить ее как структуру вместо класса, но я думаю, что это не работает с указателями. Я честно не знаком с этими деталями Свифта. – Dragonspell

+0

Посмотрите мой ответ ниже. байт работает с typealias и struct работает с мутирующим ключевым словом. – vacawama

ответ

1

typealias из Byte в UInt8 была удалена, и нет более длинный в Swift 1.2. Вы можете определить его самостоятельно или просто использовать UInt8 (лучший вариант).

В комментариях вы сказали, что непреложная проблема заключалась в том, что вы используете struct вместо class. Вы можете использовать struct, вы просто должны добавить ключевое слово mutating к любой функции, которая модифицирует struct:

typealias Byte = UInt8 

struct AtomicBoolean { 

    private var val: Byte = 0 

    /// Sets the value, and returns the previous value. 
    /// The test/set is an atomic operation. 
    mutating func testAndSet(value: Bool) -> Bool { 
     if value { 
      return OSAtomicTestAndSet(0, &val) 
     } else { 
      return OSAtomicTestAndClear(0, &val) 
     } 
    } 

    /// Returns the current value of the boolean. 
    /// The value may change before this method returns. 
    func test() -> Bool { 
     return val != 0 
    } 

} 
0

Xcode 7 Beta 4, Swift 2,0, доволен следующий, который довольно много кода с «Uint8» против «Байт»:

class AtomicBoolean { 

    private var val: UInt8 = 0 

    func testAndSet(value: Bool) -> Bool { 
     if value { 
      return OSAtomicTestAndSet(0, &val) 
     } else { 
      return OSAtomicTestAndClear(0, &val) 
     } 
    } 

    func test() -> Bool { 
     return val != 0 
    } 
} 
1

Пожалуйста, обратите внимание, что реализация этого класса bogous. Он устанавливает бит # 0, который является самым значительным, а не бит № 7, который является наименее значимым. Это правильная реализация:

public class AtomicBoolean { 
    private var val: UInt8 = 0 

    public init(initialValue: Bool) { 
    self.val = (initialValue == false ? 0 : 1) 
    } 

    public func getAndSet(value: Bool) -> Bool { 
    if value { 
     return OSAtomicTestAndSet(7, &val) 
    } else { 
     return OSAtomicTestAndClear(7, &val) 
    } 
    } 

    public func get() -> Bool { 
    return val != 0 
    } 
} 

И тест, чтобы проверить:

public class AtomicTest: XCTestCase { 

    func testSimple() { 
    let x = AtomicBoolean(initialValue: true) 
    XCTAssertTrue(x.get()) 
    XCTAssertTrue(x.get()) 
    XCTAssertTrue(x.getAndSet(true)) 
    XCTAssertTrue(x.getAndSet(false)) 
    XCTAssertFalse(x.get()) 
    XCTAssertFalse(x.getAndSet(true)) 
    XCTAssertTrue(x.get()) 
    } 
} 
Смежные вопросы