我试图理解结构在SWIFT中是如何工作的.我熟悉.NET如何处理它们以及它如何将字节打包到结构中等等.
我发现以下代码有些奇怪:
struct exampleStruct {
var ModelNumber: Byte!
var MajorVersion: Byte!
var MinorVersion: Byte!
var Revision: Byte!
}
var myStruct = exampleStruct (
ModelNumber: 1,
MajorVersion: 2,
MinorVersion: 3,
Revision: 4
)
myStruct.MinorVersion // << Returns 3
// Struct to NSData.
var data = NSData(
bytes: &myStruct,
length: sizeof(exampleStruct)
)
println("data: \(data)")
Run Code Online (Sandbox Code Playgroud)
println返回:"data:<01000200 03000400>"
我期待数据实际上是:"数据:<01020304>"
知道为什么SWIFT没有将1个字节打包为1个字节,而是将一个字节打包为2个字节(1个字节的值和1个字节的00)?
另一方面,如果我执行以下操作:
var newStruct = exampleStruct(ModelNumber: nil, MajorVersion: nil, MinorVersion: nil, Revision: nil)
var sendBytes:[Byte] = [0x1, 0x2, 0x3, 0x4]
var newData = NSData(bytes: sendBytes, …
Run Code Online (Sandbox Code Playgroud) 我很难过,无法找到关于如何做到这一点的任何教程或文档.
问题:我有两个实体,Person和Location.人可以有很多地方.我已经正确设置了一切,可以在桌面视图中添加/删除人员,没问题.
我遇到的问题是在创建第一个之后尝试添加和删除位置 - 当第一次插入人时,它还会添加一个位置.
为此,PersonModel(Person Entity)类具有:
class PersonModel: NSManagedObject {
@NSManaged var Name: String
@NSManaged var Age: String
@NSManaged var Location: NSOrderedSet
}
Run Code Online (Sandbox Code Playgroud)
LocationModel类(Location Entity)具有:
class LocationModel: NSManagedObject {
@NSManaged var State: String
@NSManaged var Person: PersonModel
}
Run Code Online (Sandbox Code Playgroud)
访问和删除位置实体中的项目的最佳方法是什么?我应该从PersonsModel还是通过LocationsModel删除对象?
执行以下操作:
func deleteObject(rowIndex:NSIndexPath){
let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let managedContext = appDelegate.managedObjectContext!
let fetchRequest = NSFetchRequest(entityName:"Locations")
var error: NSError?
locationsArray = managedContext.executeFetchRequest(fetchRequest,error: &error)!
managedContext.deleteObject(locationsArray[rowIndex.row] as NSManagedObject)
var error:NSError? = nil
if (!managedContext.save(&error)){
abort()
}
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为它返回所有位置,而不仅仅是与父/相关人员关联的对象的位置.必须有一个简单的方法来做到这一点 - 也许用谓词?
有人能指点我正确的方向吗? …
我正在尝试找出使用SWIFT 4循环遍历数字数组的最有效方法,获取任何连续数字的范围并将其添加到新数组中.我可以做标准循环检查,但我相信我可以使用地图过滤器? - 有人能指出我正确的方向吗?
开始:
myNumbersArray:[Int] = [1,2,3,4,10,11,15,20,21,22,23]
Run Code Online (Sandbox Code Playgroud)
通缉结果:
newNumbersArray = [
[1,2,3,4],
[10,11],
[15],
[20,21,22,23]
]
Run Code Online (Sandbox Code Playgroud)
如果我搞清楚,我会发布我的解决方案......
刚更新到最新的Xcode 6.3 Beta 4,我收到一个我似乎无法弄清楚的错误.
有错误是:
无法使用类型'(CCOperation,CCAlgorithm,CCOptions,UnsafePointer,(Int),nil,UnsafePointer,UInt,UnsafeMutablePointer,(Int),inout UInt)的参数列表调用'CCCrypt''
使用以下代码:
let keyBytes = UnsafePointer<UInt8>(keyData.bytes)
let keyLength = size_t(kCCKeySizeAES128)
let dataLength = UInt(self.length)
let dataBytes = UnsafePointer<UInt8>(self.bytes)
let bufferData:NSMutableData! = NSMutableData(length:Int(dataLength) + kCCBlockSizeAES128)
var bufferPointer = UnsafeMutablePointer<UInt8>(bufferData.mutableBytes)
let bufferLength = size_t(bufferData.length)
let operation: CCOperation = UInt32(kCCEncrypt)
let algoritm: CCAlgorithm = UInt32(kCCAlgorithmAES128)
let options: CCOptions = UInt32(kCCOptionECBMode)
var numBytesEncrypted: UInt = 0
var cryptStatus = CCCrypt(operation,
algoritm,
options,
keyBytes,
keyLength,
nil,
dataBytes,
dataLength,
bufferPointer,
bufferLength,
&numBytesEncrypted)
Run Code Online (Sandbox Code Playgroud)
这在Beta 3下工作得很好,即使在阅读Beta 4更改日志之后也不确定发生了什么变化.
不知道问题是什么,我应该打开Apple的错误吗?
试图清除我的 SWIFT 5/XCODE 项目中的一些警告,但我陷入了这一困境:
let sendBytes:[UInt8] = [0x0, 0x0, 0x5, 0x0]
let msgData = Data(bytes: UnsafePointer<UInt8>(sendBytes), count: sendBytes.count)
socket.write(msgData, withTimeout: -1.0, tag: 0)
socket.readData(withTimeout: -1.0, tag: 0)
Run Code Online (Sandbox Code Playgroud)
对于“UnsafePointer”,我收到以下警告和两条建议:
“UnsafePointer”的初始化导致悬空指针
从“[UInt8]”到“UnsafePointer”的隐式参数转换生成一个仅在调用“init(_:)”期间有效的指针
在数组上使用“withUnsafeBufferPointer”方法,以便将参数显式转换为对定义范围有效的缓冲区指针
这是我的解决方案,更好吗?
版本1:
let sendBytes:[UInt8] = [0x0, 0x0, 0x5, 0x0]
let uint8Pointer = UnsafeMutablePointer<UInt8>.allocate(capacity: sendBytes.count)
uint8Pointer.initialize(from: sendBytes, count: sendBytes.count)
let msgData = Data(bytes: uint8Pointer, count: sendBytes.count)
socket.write(msgData, withTimeout: -1.0, tag: 0)
socket.readData(withTimeout: -1.0, tag: 0)
Run Code Online (Sandbox Code Playgroud)
版本2:
let sendBytes:[UInt8] = [0x0, 0x0, 0x5, 0x0]
let uint8Pointer = UnsafeMutablePointer<UInt8>.allocate(capacity: sendBytes.count)
uint8Pointer.initialize(from: sendBytes, …
Run Code Online (Sandbox Code Playgroud) 我必须重做所有在 Swift 1.2 中使用布尔值的代码。现在在 Swift 2.0 中,我正确使用了 Bool,但我不清楚如何将 UInt8 (0/1) 转换为 Swift Bool。
例子:
let timeDateValid:Bool = bytes[0]
Run Code Online (Sandbox Code Playgroud)
错误消息: 无法将类型“UInt8”转换为指定类型“Bool”
谢谢!
我似乎无法弄清楚为什么只有“24:00”返回 nil 而不是 12:00AM,而“23:59”正确返回为 11:59PM。
let dateAsString = "24:00"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "HH:mm"
dateFormatter.locale = NSLocale(localeIdentifier: "en_US_POSIX") as Locale
let date = dateFormatter.date(from: dateAsString)
dateFormatter.dateFormat = "h:mm a"
let Date12 = dateFormatter.string(from: date!)
print(Date12)
Run Code Online (Sandbox Code Playgroud)