我正在创建几个NSView类,所有类都支持特殊操作,我们将调用它们transmogrify.乍一看,这似乎是协议的完美之处:
protocol TransmogrifiableView {
func transmogrify()
}
Run Code Online (Sandbox Code Playgroud)
然而,该协议并没有执行,每一个TransmogrifiableView是一个NSView为好.这意味着NSView我在a上调用的任何方法TransmogrifiableView都不会键入check:
let myView: TransmogrifiableView = getTransmogrifiableView()
let theSuperView = myView.superView // error: TransmogrifiableView does not have a property called 'superview'
Run Code Online (Sandbox Code Playgroud)
我不知道如何要求实现我的协议的所有类也是子类NSView.我试过这个:
protocol TransmogrifiableView: NSView {
func transmogrify()
}
Run Code Online (Sandbox Code Playgroud)
但是Swift抱怨协议不能从类继承.将协议转换为仅使用类的协议没有帮助
protocol TransmogrifiableView: class, NSView {
func transmogrify()
}
Run Code Online (Sandbox Code Playgroud)
我不能创建TransmogrifiableView超类而不是协议,因为我的一些TransmogrifiableView类必须是其他非transmogrifiable视图的子类.
我应该如何要求所有TransmogrifiableView的也可以NSView的?我真的不想用as"转换"来改变我的代码,这种转换形式不好而且分散注意力.
任何人都可以解释的意义someViewController.delegate = self和self.delegate?他们在哪里帮助我们?
好吧,我知道这个问题的答案是ICMP - 我所有的教科书都这么说,互联网就这么说,每个人都这么说......除了我的TA.根据这个TA ping不仅用于ICMP,还用于IP,arp和其他一些.那么...用于ping的协议是哪些?ICMP以外的其他?
我刚开始使用swift语言并且来自java它到目前为止看起来很棒.但我真的错过了一些东西:
Eclipse有这个很棒的功能,当我添加"implements XYZ"时,它为我提供了一个自动实现必要的函数存根的功能.这是一个巨大的节省时间.
Xcode似乎没有这个功能,或者我错过了什么?
我找到了accessorize插件,但这似乎只适用于Objective C ..
有解决方案吗?
PS.我正在使用Xcode 6.1.1
我不认为这可以做,但无论如何我都会问.我有一个协议:
protocol X {}
Run Code Online (Sandbox Code Playgroud)
一节课:
class Y:X {}
Run Code Online (Sandbox Code Playgroud)
在我的其余代码中,我使用协议X引用所有内容.在该代码中,我希望能够执行以下操作:
let a:X = ...
let b:X = ...
if a == b {...}
Run Code Online (Sandbox Code Playgroud)
问题是,如果我尝试实现Equatable:
protocol X: Equatable {}
func ==(lhs:X, hrs:X) -> Bool {
if let l = lhs as? Y, let r = hrs as? Y {
return l.something == r.something
}
return false
}
Run Code Online (Sandbox Code Playgroud)
尝试允许使用==隐藏协议背后的实现的想法.
Swift不喜欢这个,因为它Equatable有Self引用,它将不再允许我将它用作类型.仅作为一般参数.
那么有没有人找到一种方法将一个运算符应用于一个协议,而协议不会作为一种类型变得无法使用?
如果我发送两条TCP消息,我是否需要处理后者到达之前的情况?还是保证按我发送的订单到达?我假设这不是Twisted特定的例子,因为它应该符合TCP标准,但是如果熟悉Twisted的人可以为我自己的安心提供特定于Twisted的答案,那将不胜感激:-)
我经常看到协议版本附加了"bis"(例如v.34bis或httpbis).
"bis"是什么意思或代表什么?
我认识的一位电信工程师认为它可能源于法国.
我设法让JSON和plist编码和解码都工作,但只能通过直接调用特定对象上的编码/解码函数.
例如:
struct Test: Codable {
var someString: String?
}
let testItem = Test()
testItem.someString = "abc"
let result = try JSONEncoder().encode(testItem)
Run Code Online (Sandbox Code Playgroud)
这很好,没有问题.
但是,我试图获得一个只接受Codable协议一致性类型的函数并保存该对象.
func saveObject(_ object: Encodable, at location: String) {
// Some code
let data = try JSONEncoder().encode(object)
// Some more code
}
Run Code Online (Sandbox Code Playgroud)
这会导致以下错误:
无法使用类型'(Encodable)'的参数列表调用'encode'
看看编码函数的定义,似乎它应该能够接受Encodable,除非Value是一些我不知道的奇怪类型.
open func encode<Value>(_ value: Value) throws -> Data where Value : Encodable
Run Code Online (Sandbox Code Playgroud) 这是一个通用的问题.我不是在寻找最好的答案,我希望你能表达你最喜欢的做法.
我想用Java实现一个网络协议(但这是一个相当普遍的问题,我在C++中面临同样的问题),这不是第一次,正如我之前所做的那样.但我认为我错过了实施它的好方法.实际上通常都是关于在主机之间交换文本消息和一些字节缓冲区,存储状态并等到下一条消息到来.问题是我通常最终得到一堆开关,并且或多或少复杂的if语句对不同的状态/消息作出反应.整件事情通常变得复杂而难以保持.更不用说有时出现的东西有一些"盲点",我的意思是协议的状态没有被覆盖并且以不可预测的方式表现.我试着写下一些状态机类,负责以或多或少的智能方式检查每个动作的开始和结束状态.这使编程协议变得非常复杂,因为我必须编写行和代码行来覆盖每种可能的情况.我喜欢的是一个好的模式,或者用于编写复杂协议的最佳实践,易于维护和扩展,并且非常易读.
你有什么建议?
虽然我有一些想法可以使用,但确切的用法仍然不清楚.有人能解释一下......?谢谢.
protocols ×10
ios ×4
swift ×4
autocomplete ×1
c++ ×1
cocoa ×1
codable ×1
definition ×1
delegates ×1
delegation ×1
equatable ×1
http ×1
inheritance ×1
interface ×1
iphone ×1
java ×1
networking ×1
objective-c ×1
ping ×1
python ×1
tcp ×1
twisted ×1
typechecking ×1
xcode ×1