小编Ste*_*fan的帖子

Swift:"failable initializer'init()'不能覆盖不可用的初始化程序"与默认参数

如果我宣布

public class A: NSObject {
    public class X { }
    public init?(x: X? = nil) { }
}
Run Code Online (Sandbox Code Playgroud)

一切都很好.使用它时let a = A(),初始化程序按预期调用.

现在,我想让嵌套类成为X私有,并且参数化init也是如此(当然必须是).但是一个简单的init?()应该像以前一样公开.所以我写

public class B: NSObject {
    private class X { }
    private init?(x: X?) { }
    public convenience override init?() { self.init(x: nil) }
}
Run Code Online (Sandbox Code Playgroud)

但是这会给init?()初始化程序带来错误:可用的初始化程序'init()'不能覆盖不可用的初始化程序,并且覆盖的初始化程序为public init()in NSObject.

为什么我可以有效地声明一个A.init?()没有冲突的初始化器但不是B.init?()

奖金问题:为什么我不允许使用可用的初始化程序覆盖不可用的初始化程序?相反的是合法的:我可以使用不可用的覆盖可用的初始化程序,这需要使用强制super.init()!,因此引入了运行时错误的风险.对我来说,让子类具有可用的初始化器感觉更加明智,因为功能的扩展会带来更多的失败机会.但也许我在这里遗漏了一些东西 - 解释非常感谢.

initializer swift failable

9
推荐指数
2
解决办法
5020
查看次数

如何在Swift中抑制特定警告

我有一个Swift函数做这样的事情:

func f() -> Int {
    switch (__WORDSIZE) {
        case 32: return 1
        case 64: return 2
        default: return 0
    }
}
Run Code Online (Sandbox Code Playgroud)

因为__WORDSIZE是常量,所以编译器总是在开关体中给出至少一个警告.实际标记了哪些行取决于我正在构建的目标(例如iPhone 5对6;有趣的是iPhone 5给出了64位情况的警告,而iPhone 6给出了32位和默认的两个警告).

我发现,雨燕的等价物#pragma// MARK:,所以我尝试

// MARK: clang diagnostic push
// MARK: clang diagnostic ignored "-Wall"
func f() -> Int {
    switch (__WORDSIZE) {
        case 32: return 1
        case 64: return 2
        default: return 0
    }
}
// MARK: clang diagnostic pop
Run Code Online (Sandbox Code Playgroud)

但警告仍然存在,MARKs似乎没有效果.

作为一种解决方法,我现在有这样的事情:

#if arch(arm) || arch(i386)
    return …
Run Code Online (Sandbox Code Playgroud)

compiler-warnings swift

7
推荐指数
1
解决办法
6387
查看次数

.Net DateTime与当地时间和夏令时

我担心我不明白.Net的DateTime类如何处理本地时间戳(我住在德国,所以我的语言环境是de_DE).也许有人可以启发我一点;-)

DateTime构造可以用一年被调用,一个月等参数.另外,可以提供DateTimeKind值,,或(=默认值).LocalUtcUnspecified

例:

DateTime a = new DateTime(2015, 03, 29, 02, 30, 00, DateTimeKind.Local);
DateTime b = new DateTime(2015, 03, 29, 02, 30, 00, DateTimeKind.Utc);
DateTime c = new DateTime(2015, 03, 29, 02, 30, 00, DateTimeKind.Unspecified);
DateTime d = new DateTime(2015, 03, 29, 02, 30, 00);
Run Code Online (Sandbox Code Playgroud)

根据定义,值c和d是相同的.但如果我将所有四个相互比较,那么所有四个都是相同的.检查VS调试器中的对象会显示所有Ticks值(InternalTicks以及相同).但是,内部dateData值不同,但比较运算符显然会忽略它们.

您可能已经注意到,我在今年3月29日02:30 AM构建了一个值.这个时刻在我们的时区中不存在,因为切换到夏令时会跳过它.所以我原本期望得到构造对象的异常a,但这并没有发生.

此外,DateTime还有一种方法ToUniversalTime()可将解释为本地时间的值转换为等效的UTC值.为了测试,我按如下方式运行循环:

DateTime dt = new DateTime(2015, 03, 29, 01, 58, …
Run Code Online (Sandbox Code Playgroud)

.net c# datetime localtime dst

4
推荐指数
2
解决办法
1496
查看次数

将当前时间部署到 LoRaWAN 节点?

大多数 LoRaWAN 节点没有电池供电的 RTC(实时时钟)。唯一可用的时钟是控制器中的“自启动以来的时间”计数器。尽管 LoRaWAN 数据包在网关接收时带有时间戳,但节点上的事件与实时(例如 UTC)之间没有严格的关系。如果事件在通过 LoRa 传输之前在节点中排队,这一点尤其重要。那么,是否有一种机制可以以相当精确的方式将实时部署到节点呢?当然,在收到下一条消息时将实时标记作为上传电报发送到节点是不够的。时间戳是否在连接范围内发送?

time timestamp lorawan

4
推荐指数
1
解决办法
1571
查看次数