我有一个协议P,它返回一个对象的副本:
protocol P {
func copy() -> Self
}
Run Code Online (Sandbox Code Playgroud)
以及实现P的C类:
class C : P {
func copy() -> Self {
return C()
}
}
Run Code Online (Sandbox Code Playgroud)
但是,我是否输入返回值,因为Self我得到以下错误:
无法将类型为"C"的返回表达式转换为返回类型"Self"
我也试过回来了C.
class C : P {
func copy() -> C {
return C()
}
}
Run Code Online (Sandbox Code Playgroud)
这导致以下错误:
非终结类'C'中的方法'copy()'必须返回
Self以符合协议'P'
没有什么可行的,除了我前缀class C为finalie 的情况:
final class C : P {
func copy() -> C {
return C()
}
}
Run Code Online (Sandbox Code Playgroud)
但是,如果我想继承C,那么什么都行不通.有没有办法解决?
在Swift游乐场玩耍的时候,我注意到,Self大写字母"S"可以和小写一起使用self.它们之间有什么区别吗?如果是这样,这两者的用途是什么,特别是对于Self?
metatype .Type和.selfSwift有什么区别?
做.self并.Type返回struct?
我明白.self可以用来检查dynamicType.你怎么用的.Type?
我有一个自定义运算符全局定义如下:
func ==(lhs: Item!, rhs: Item!)->Bool {
return lhs?.dateCreated == rhs?.dateCreated
}
Run Code Online (Sandbox Code Playgroud)
如果我执行此代码:
let i1 = Item()
let i2 = Item()
let date = Date()
i1.dateCreated = date
i2.dateCreated = date
let areEqual = i1 == i2
Run Code Online (Sandbox Code Playgroud)
areEqual是假的.在这种情况下,我确信我的自定义操作符没有触发.但是,如果我将此代码添加到操场中:
//same function
func ==(lhs: Item!, rhs: item!)->Bool {
return lhs?.dateCreated == rhs?.dateCreated
}
//same code
let i1 = Item()
let i2 = Item()
let date = Date()
i1.dateCreated = date
i2.dateCreated = date
let areEqual = i1 == i2
Run Code Online (Sandbox Code Playgroud)
areEqual 是的 …
Swift协议可以通过向它们添加扩展来为函数和计算属性提供默认实现.我做了很多次.我的理解是,默认实现仅用作"后备":当类型符合协议但不提供自己的实现时执行.
至少我是如何阅读Swift编程语言指南的:
如果符合类型提供其自己的必需方法或属性的实现,则将使用该实现而不是扩展提供的实现.
现在我遇到了这样一种情况:我实现特定协议的自定义类型确实为特定函数提供了一个实现,但它没有被执行 - 而是执行协议扩展中定义的实现.
作为示例,我定义了一个Movable具有函数move(to:)和扩展的协议,该协议为此函数提供了一个默认实现:
protocol Movable {
func move(to point: CGPoint)
}
extension Movable {
func move(to point: CGPoint = CGPoint(x: 0, y: 0)) {
print("Moving to origin: \(point)")
}
}
Run Code Online (Sandbox Code Playgroud)
接下来,我定义一个Car符合的类,Movable但为move(to:)函数提供了自己的实现:
class Car: Movable {
func move(to point: CGPoint = CGPoint(x: 0, y: 0)) {
print("Moving to point: \(point)")
}
}
Run Code Online (Sandbox Code Playgroud)
现在我创建一个新的Car并将其向下转换为Movable:
let castedCar = …Run Code Online (Sandbox Code Playgroud) extension-methods protocols swift swift-extensions swift-protocols
有没有办法获得扩展我的协议的类类型或结构类型?
这是我的示例代码:
protocol a {}
extension a {
static func list(completion: ([StructType] -> Void)) {
var items = [StructType]()
...
completion(items)
}
}
struct b{}
extension b: a {}
struct c{}
extension c: a{}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我想动态获取 struct a和b的类型,以便我可以生成它的列表并返回。
预先感谢您亲切地回答我的问题。
在下面的代码中,我不明白为什么在使用Self()? 如果我用Fireman().
final class Fireman {
var numOfServices = 0
private init(){}
static var shared = Self() <-------- Here !!!
func extinguishFire() {
self.numOfServices += 1
print("Spraying water...\(self.numOfServices)")
}
}
Run Code Online (Sandbox Code Playgroud)
我必须标记该类的另一个原因final是,如果没有该错误消息,我必须包含一个required初始化程序(当我这样做时,我再次收到错误,因为我的初始化程序是private)。所以只是为了避免进一步的子类化,尽管违背我的意愿,我宣布类最终