2016-06-20 16 views
4

NSMutableDataInt'sまたはFloatの配列を作成し、それらをディスクに保存することができます。新しいデータ構造体にIntを追加する方法(Swift 3)

protocol BinaryConvertible 
{ 
    init() 
} 

extension Int : BinaryConvertible {} 


struct Storage<T: BinaryConvertible> 
{ 
let data = NSMutableData() 

func append(value: T) 
{ 
    var input = value 
    data.append(&input, length: sizeof(T)) 
} 

func extract(index: Int) -> T 
{ 
    var output = T() 
    let range = NSRange(location: index * sizeof(T), length: sizeof(T)) 
    data.getBytes(&output, range: range) 
    return output 
} 
} 

スウィフト3はボンネットの下NSDataを使用する新しいDataタイプを有しています。 StringおよびNSStringのようになります。例を追加する方法がわかりません。新しい方法を使用してDouble

append関数の結果はUnsafePointer<UInt8>になりますが、これはDoubleまたはランダム構造体からどのように作成するのですか?

+1

可能な重複:/ /stackoverflow.com/questions/29556610/cast-a-swift-struct-to-unsafemutablepointervoid) – Alexander

+0

私はそうは思わない。迅速に3 DataはUnsafePointer を期待しています。 UInt8型に注意してください。私が今までに見つけたものはすべてUnsafePointer ポインタを扱っています。私はディスクに書き込むことができるようにバイトを取得し、後でそれらのバイトを読み戻す必要があります。 – user965972

+0

それはキャストすることができます – Alexander

答えて

10

ポインタを使って作業することは、私がSwiftでやるにはあまり好きではないものの、良い学習体験を提供します。これは私の作品:

struct Storage<T: BinaryConvertible> 
{ 
    var data = Data() 

    mutating func append(value: T) 
    { 
     var input = value 
     let buffer = UnsafeBufferPointer(start: &input, count: 1) 
     self.data.append(buffer) 
    } 

    func extract(index: Int) -> T 
    { 
     let startIndex = index * sizeof(T) 
     let endIndex = startIndex + sizeof(T) 

     var output = T() 
     let buffer = UnsafeMutableBufferPointer(start: &output, count: 1) 
     let _ = self.data.copyBytes(to: buffer, from: startIndex..<endIndex) 

     return output 
    } 
} 

var s = Storage<Double>() 
s.append(value: M_PI) 
s.append(value: 42) 
s.append(value: 100) 

print(s.extract(index: 0)) 
print(s.extract(index: 1)) 
print(s.extract(index: 2)) 
1

私は+を使用したいか[UnsafeMutablePointer へスウィフト構造体をキャスト](HTTPの+ =

public protocol DataConvertible { 
    static func + (lhs: Data, rhs: Self) -> Data 
    static func += (lhs: inout Data, rhs: Self) 
} 

extension DataConvertible { 
    public static func + (lhs: Data, rhs: Self) -> Data { 
     var value = rhs 
     let data = Data(buffer: UnsafeBufferPointer(start: &value, count: 1)) 
     return lhs + data 
    } 

    public static func += (lhs: inout Data, rhs: Self) { 
     lhs = lhs + rhs 
    } 
} 

extension UInt8 : DataConvertible { } 
extension UInt16 : DataConvertible { } 
extension UInt32 : DataConvertible { } 

extension Int : DataConvertible { } 
extension Float : DataConvertible { } 
extension Double : DataConvertible { } 

extension String : DataConvertible { 
    public static func + (lhs: Data, rhs: String) -> Data { 
     guard let data = rhs.data(using: .utf8) else { return lhs} 
     return lhs + data 
    } 
} 

extension Data : DataConvertible { 
    public static func + (lhs: Data, rhs: Data) -> Data { 
     var data = Data() 
     data.append(lhs) 
     data.append(rhs) 

     return data 
    } 
} 

サンプル

var data = Data() 
data += 1 
data += 1.0 
data += UInt8(1) 
data += "1" 
関連する問題