我整天都在与 NWConnection 作斗争,以在长时间运行的 TCP 套接字上接收数据。由于缺乏文档,我在给自己造成以下错误后终于让它工作了:
我所学到的总结:
这是我的代码。我认为这是对的。但如果错了请告诉我:
queue = DispatchQueue(label: "hostname", attributes: .concurrent)
let serverEndpoint = NWEndpoint.Host(hostname)
guard let portEndpoint = NWEndpoint.Port(rawValue: port) else { return nil }
connection = NWConnection(host: serverEndpoint, port: portEndpoint, using: .tcp)
connection.stateUpdateHandler = { [weak self] (newState) in
switch newState {
case .ready:
debugPrint("TcpReader.ready to send")
self?.receive()
case .failed(let error):
debugPrint("TcpReader.client failed with error \(error)")
case .setup: …
Run Code Online (Sandbox Code Playgroud) 对于没有默认情况的Double类型,swift开关可以是穷举吗?
此开关(没有默认情况)给出错误:开关必须是详尽的:
var minY = 1.0
switch minY {
case -(Double.infinity)..<0.9:
yAxisMinimum = 0.0
case (0.9..<0.99):
yAxisMinimum = 0.9
case (0.99..<0.999):
yAxisMinimum = 0.99
case (0.999..<0.9999):
yAxisMinimum = 0.999
case (0.9999...Double.infinity):
yAxisMinimum = 0.9999
}
Run Code Online (Sandbox Code Playgroud)
但是这个带有(无用的)默认情况的开关可以工作:
var minY = 1.0
switch minY {
case -(Double.infinity)..<0.9:
yAxisMinimum = 0.0
case (0.9..<0.99):
yAxisMinimum = 0.9
case (0.99..<0.999):
yAxisMinimum = 0.99
case (0.999..<0.9999):
yAxisMinimum = 0.999
case (0.9999...Double.infinity):
yAxisMinimum = 0.9999
default:
yAxisMinimum = 0.0
}
Run Code Online (Sandbox Code Playgroud)
我尽量避免使用我的开关的默认情况,但不知道是否可以使用Double.
我成功地将 environmentObject appSettings 传递到我的视图中。我可以用它来修改我的字体和视图中的选择器。但是,如果我尝试在视图 init() 中访问 environmentObject 发布的变量,它会崩溃:
Thread 1: Fatal error: No ObservableObject of type AppSettings found.
A View.environmentObject(_:) for AppSettings may be missing as an ancestor of this view.
Run Code Online (Sandbox Code Playgroud)
在自定义 SwiftUI 视图初始值设定项中使用 environmentObject 是否有特殊规则?
这是我的视图代码的开始。environmentObject 是 appSettings。如果我在初始化程序中注释掉第 2 行并取消注释第 3 行,应用程序就可以运行。请注意,我稍后在我的选择器中成功使用了“appSettings.interfaces”。
struct CaptureFilterView: View {
@State var etherCapture: EtherCapture? = nil
@EnvironmentObject var appSettings: AppSettings
@Binding var frames: [Frame]
@State var captureFilter: String = ""
@State var error: String = ""
@State var numberPackets = 10
@State var …
Run Code Online (Sandbox Code Playgroud) IPv4 地址相对容易验证:它们有 4 个八位字节,由数字分隔。每个八位位组都是 0-255 范围内的整数。
IPv6 地址很难验证。它们有 8 个十六进制数,每个十六进制数有 4 个十六进制数字,用冒号分隔。IPv6 地址还具有缩短规则,可以删除每个十六进制数中的前导零(在每个十六进制数中至少留下一个零)。此外,一个或多个连续的 :0: 十六进制可以缩短为 ::,但每个 IPv6 地址中只能缩短一次。
如何在 Swift 中验证 IPv4 和 IPv6 地址?