我有一个结构,我想保存到UserDefaults.这是我的结构
struct Song {
var title: String
var artist: String
}
var songs: [Song] = [
Song(title: "Title 1", artist "Artist 1"),
Song(title: "Title 2", artist "Artist 2"),
Song(title: "Title 3", artist "Artist 3"),
]
Run Code Online (Sandbox Code Playgroud)
在另一个ViewController中,我有一个附加到这个结构的UIButton
@IBAction func likeButtonPressed(_ sender: Any) {
songs.append(Song(title: songs[thisSong].title, artist: songs[thisSong].artist))
}
Run Code Online (Sandbox Code Playgroud)
我想要它,以便每当用户也点击该按钮时,它会将结构保存到UserDefaults,这样每当用户退出应用程序然后打开它时,它就会被保存.我该怎么做?
我只想将数组转换为Swift中的元组; 类似以下内容:
>>> myArray = [1,2,3,4,5]
>>> mytuple = tuple(myArray)
>>> mytuple
(1, 2, 3, 4, 5)
Run Code Online (Sandbox Code Playgroud)
最简单的方法是什么?
(我今天才开始学习Swift,所以我非常非常新).
以前在Swift 2.2中工作的代码现在在Swift 3中抛出以下错误:
这是我的代码:
let tempData: NSMutableData = NSMutableData(length: 26)!
tempData.replaceBytes(in: NSMakeRange(0, data.count), withBytes:data.bytes)
Run Code Online (Sandbox Code Playgroud)
我应该用什么来代替"data.bytes"来修复错误?我已经尝试实现'withUnsafeBytes'并查看了Apple的文档,但无法理解它!
我发现Swift
并NSData
成为一种沮丧的邪恶婚姻.我发现每次处理这件事情时,我觉得所有新发现的Swift安全都会消失.崩溃的数量(没有帮助的痕迹)没有帮助.
所以,我已经了解到,我可以UnsafeMutablePointer
通过执行以下操作来避免可怕的事情:
var bytes = [UInt8](count: 15, repeatedValue: 0)
anNSData.getBytes(&bytes, length=15)
Run Code Online (Sandbox Code Playgroud)
我还发现,我可以直接提取到奇异值:
var u32:UInt32 = 0
anNSData.getBytes(&u32, length=4)
Run Code Online (Sandbox Code Playgroud)
这导致两个中间问题:
1)我可以使用哪些东西比那里的硬编码常量更可靠.如果这是C,我只是用sizeof
.但我觉得我读,也许我应该使用strideof
代替sizeof
?这不会起作用[UInt8]
,不是吗?
2)文档(对于Swift)说这个参数应该是_ buffer: UnsafeMutablePointer<Void>
.那么这是如何工作的呢?我刚刚幸运吗?为什么我要这样做而不是更原生/托管[Uint8]构造?我想知道是否UnsafeMutablePointer
是一个协议,但它是一个结构.
大胆地直接读取值(而不是数组),我想也许我可以尝试另一种结构.我有一个6字节的结构,看起来像:
struct TreeDescription : Hashable {
var id:UInt32 = 0x00000000
var channel:UInt8 = 0x00
var rssi:UInt8 = 0x00
var hashValue:Int {
return Int(self.id)
}
}
Run Code Online (Sandbox Code Playgroud)
哪个实际上有效(在认为它没有,但最终做了一个干净,使一些崩溃消失)!
var tree = TreeDescription()
anNSData.getBytes(&newTree, length: 6)
Run Code Online (Sandbox Code Playgroud)
但这让我担心结构包装细节?为什么这样做?这件事我应该担心什么?
这一切对我来说都很有趣.我认为Swift从C中取出了ObjectiveC.