在Atmel数据表中,我看到了一个我以前从未见过的符号,例如:
寄存器位MAX_BE定义CSMA-CA算法中的退避指数的最大值.它等于macMaxBE; 参见[2]的7.5.1.4节.有效值为[4'd8,4'd7,...,4'd3].
如何解释/解码4'd#值?
我在文档中找不到任何指示单个CALayer(或子类)是否可以用作mask
其他多个层的属性的内容。可能吗?还是不确定?
我正在做一些串行协议的东西,并希望在python中实现一个基本的字节填充算法.我正在努力确定什么是最pythonic方式来做到这一点.
字节填充基本上只是用一个由转义字节组成的对和用可逆方式转换的原始字节(例如xor'ed)替换任何"保留"字节.
到目前为止,我已经有了5种不同的方法,每种方法都有一些我不喜欢的方法:
def stuff1(bits):
for byte in bits:
if byte in _EscapeCodes:
yield PacketCode.Escape
yield byte ^ 0xFF
else:
yield byte
Run Code Online (Sandbox Code Playgroud)
这可能是我最喜欢的,但也许只是因为我对基于产量的发电机着迷.我担心发电机会让它变慢,但它实际上是第二快的.
def stuff2(bits):
result = bytes()
for byte in bits:
if byte in _EscapeCodes:
result += bytes([PacketCode.Escape, byte ^ 0xFF])
else:
result += bytes([byte])
return result
Run Code Online (Sandbox Code Playgroud)
不断创建单个元素数组只是为了抛出它们,因为我不知道任何"带有一个额外元素的复制"操作.它与最慢的一群联系在一起.
def stuff3(bits):
result = bytearray()
for byte in bits:
if byte in _EscapeCodes:
result.append(PacketCode.Escape)
result.append(byte ^ 0xFF)
else:
result.append(byte)
return result
Run Code Online (Sandbox Code Playgroud)
似乎比直接bytes()
方法更好.实际上比yield生成器慢,并且可以一次执行一个字节(而不是需要中间1个元素集合).但它感到野蛮.这是包装性能的中间部分.
def stuff4(bits): …
Run Code Online (Sandbox Code Playgroud) 我有一个可能看起来像的目录结构
Data
Current
A
B
C
Previous
A
X
Run Code Online (Sandbox Code Playgroud)
在尽可能简单/快速的步骤中,我想重命名Current
为Previous
包含内容并擦除原始内容,使其现在:
Data
Previous
A
B
C
Run Code Online (Sandbox Code Playgroud)
我尝试过类似的东西:
from pathlib import Path
src = Path('Data/Current')
dest = Path('Data/Previous')
src.replace(dest)
Run Code Online (Sandbox Code Playgroud)
文档让我希望这会起作用:
如果target指向现有文件或目录,则将无条件地替换它.
但它似乎确实是有条件的.我得到一个Directory not empty
例外.我想我可以先递归删除Previous
目录.这基本上是唯一的解决方案吗?或者有更好的方法来实现这一目标吗?
(我更喜欢pathlib
,但如果os
或者shutil
是更好的锤子,我不反对他们)
(我在Linux上运行)
我喝了Swift中的struct / value koolaid。现在我有一个有趣的问题,我不知道该如何解决。我有一个结构是一个容器,例如
struct Foo {
var bars:[Bar]
}
Run Code Online (Sandbox Code Playgroud)
在对此进行编辑时,我会创建副本,以便保留撤消堆栈。到目前为止,一切都很好。就像显示的好教程一样。不过,我与此人一起使用了一些派生属性:
struct Foo {
var bars:[Bar]
var derivedValue:Int {
...
}
}
Run Code Online (Sandbox Code Playgroud)
在最近的分析中,我注意到a)计算派生Value的计算是一种昂贵/冗余的b)在各种用例中并不总是必须进行计算。
按照我经典的OOP方式,我会将其设置为记忆/惰性变量。基本上,在调用之前将其设置为零,对其进行一次计算并存储,然后在以后的调用中返回所述结果。由于我遵循的是“制作副本以进行编辑”模式,因此不变性不会被破坏。
但是我无法弄清楚如果是struct则如何应用这种模式。我可以做这个:
struct Foo {
var bars:[Bar]
lazy var derivedValue:Int = self.computeDerivation()
}
Run Code Online (Sandbox Code Playgroud)
它起作用,直到结构引用该值本身,例如
struct Foo {
var bars:[Bar]
lazy var derivedValue:Int = self.computeDerivation()
fun anotherDerivedComputation() {
return self.derivedValue / 2
}
}
Run Code Online (Sandbox Code Playgroud)
此时,编译器会抱怨,因为anotherDerivedComputation
正在引起接收方的更改,因此需要进行标记mutating
。使访问器被标记为变异只是感觉不对。但是对于咧嘴笑,我尝试了一下,但是这带来了一系列新的问题。现在任何我有表达的地方
XCTAssertEqaul(foo.anotherDerivedComputation(), 20)
Run Code Online (Sandbox Code Playgroud)
编译器抱怨,因为参数隐式是一个不变的let值,而不是var。
我是否缺少一种具有延迟/惰性/缓存成员的结构的模式?
我有很多(目前有 208 个)SVG 文件,我以编程方式将它们转换.imageset
为我的 iOS 应用程序的资产。我想以某种方式为 Android 做同样的事情。
我对New>>Vector Asset
从 Studio 菜单使用的结果感到非常满意。但我真的不想那样做 208 次。当 SVG 更新时,将来还会有更多次。
有什么方法可以编写此导入过程的脚本吗?
我不想在某个网站上的某个地方批量处理它们。如果可能的话,我想以某种方式使用当前的工作室工具。或者一个完全独立的命令行工具。
假设我有用于模拟各种数据包格式的结构:
#define MaxPacket 20
typedef struct {
u8 packetLength;
union {
u8 bytes[MaxPacket];
struct {
u16 field1;
u16 field2;
u16 field3;
} format1;
struct {
double value1;
double value2;
} format2;
};
} Packet;
Run Code Online (Sandbox Code Playgroud)
我可以预期那sizeof(Packet)
将是21
。但是有什么办法可以做这样的事情:
sizeof(Packet.format2)
Run Code Online (Sandbox Code Playgroud)
? 我试过了,但编译器不满意。显然,我可以将其format1
作为单独的 typedef 取出,然后我可以sizeof(format1)
. 但我很好奇我是否必须经历这一切。我喜欢格式的层次结构。这是在 8 位处理器上使用 gcc。
如果有办法使用嵌套类型,我同样感兴趣。如果我必须做很多
aPacketPointer->format2.value1; // not so onerous, but if the nesting gets deeper...
Run Code Online (Sandbox Code Playgroud)
那么有时这样做会很好:
Packet.format2 *formatPtr = &aPacketPointer->format2;
formatPtr->value2; // etc
Run Code Online (Sandbox Code Playgroud)
同样,重构为一堆前面的 typedef 可以解决这个问题,但是我失去了嵌套点引用的良好命名空间效果。
在Swift2.2中,我有一个扩展Optional
,看起来像:
extension Optional {
func ifNotNil<T>(_ closure:(Wrapped) -> T) -> T? {
switch self {
case .some (let wrapped):
return closure(wrapped)
case .none:
return nil
}
}
}
Run Code Online (Sandbox Code Playgroud)
它允许代码
anImageView.image = self.something.ifNotNil { self.getImageFor($0) }
Run Code Online (Sandbox Code Playgroud)
但有时候,我不关心结果:
myBSON["key"].string.ifNotNil {
print($0}
}
Run Code Online (Sandbox Code Playgroud)
在Swift2.2中,它就像一个魅力.但是启动新的XCode8 Beta并转换为Swift3,我在第二种类型的任何地方都会收到警告.这几乎就像隐含着一样@warn_unused_result
.这只是一个早期的测试版错误吗?或者我在Swift3中不能做的事情?或者我需要在Swift3中重新修复的东西?
我希望能够膨胀/收缩Swift3数据结构.我找到了GzipSwift,但目前尚不清楚我是如何将其提供给我的iOS应用程序的.我试过的天真的事情包括:
将Data+Gzip.swift
文件复制到我自己的项目中.然后抱怨import zlib
所述文件的顶部.我认为这与相同源的zlib目录中的modulemap文件有关.但是我不确定在我自己的项目中重建那些内容或者如何重建这些内容.
从github克隆存储库,打开XCode并内置(基本上按下了运行按钮).然后尝试将其作为链接库或框架添加到我自己的项目中.我很确定只选择存储库的顶级目录不是我想做的,但我不知道还有什么可以尝试.
我已经找到了一些其他的代码,但它似乎过时并且相对于Swift2.
我有一个CAShapeLayer
非零CALayer 的实例mask
.我正在尝试使用该蒙版的框架来剪裁形状.哪个工作正常.但是当我改变帧时,我不希望它为帧变化设置动画.我在视图中更新了框架,我layoutSubviews
发现了一些有趣的东西:
override func layoutSubviews() {
super.layoutSubviews()
...
if let futureMask = self.futureShape.mask {
"0.future position animation \(futureMask.animation(forKey: "position"))".print()
futureMask.removeAllAnimations()
futureMask.add(CAAnimation(), forKey: "position")
futureMask.add(CAAnimation(), forKey: "bounds")
"1.future position animation \(futureMask.animation(forKey: "position"))".print()
let nowX = computeNowX()
futureMask.frame = CGRect(x: box.left + nowX, y: box.top, width: box.width - nowX, height: box.height)
"2.future position animation \(futureMask.animation(forKey: "position"))".print()
}
}
Run Code Online (Sandbox Code Playgroud)
这产生的输出如下:
0.future position animations Optional(<CABasicAnimation:0x174624ac0; duration = 0.25; fillMode = backwards; timingFunction = default; keyPath = position; fromValue …
Run Code Online (Sandbox Code Playgroud) ios ×3
swift ×3
swift3 ×3
calayer ×2
python ×2
python-3.x ×2
bitstuffing ×1
c ×1
embedded ×1
file-rename ×1
gcc ×1
idiomatic ×1
mask ×1
memoization ×1
nested ×1
struct ×1
svg ×1
swift-data ×1
xcode8 ×1
zlib ×1