相关疑难解决方法(0)

Protocol func返回Self

我有一个协议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 Cfinalie 的情况:

final class C : P {
    func copy() -> C  {
        return C()
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我想继承C,那么什么都行不通.有没有办法解决?

protocols subclassing swift swift-protocols

70
推荐指数
5
解决办法
2万
查看次数

大写"自我"和小写"自我"之间的区别Swift

在Swift游乐场玩耍的时候,我注意到,Self大写字母"S"可以和小写一起使用self.它们之间有什么区别吗?如果是这样,这两者的用途是什么,特别是对于Self

self swift

66
推荐指数
4
解决办法
8780
查看次数

Swift - metatype .Type和.self之间有什么区别?

metatype .Type.selfSwift有什么区别?

.self.Type返回struct

我明白.self可以用来检查dynamicType.你怎么用的.Type

swift

51
推荐指数
3
解决办法
1万
查看次数

==自定义类的重载并不总是被调用

我有一个自定义运算符全局定义如下:

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

9
推荐指数
1
解决办法
927
查看次数

使用协议中定义的默认参数实现函数

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

8
推荐指数
1
解决办法
3184
查看次数

Swift - 如何获得从协议扩展的类?

有没有办法获得扩展我的协议的类类型或结构类型?

这是我的示例代码:

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 ab的类型,以便我可以生成它的列表并返回。

预先感谢您亲切地回答我的问题。

protocols swift

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

无法从存储的属性初始值设定项中引用协变“Self”类型

在下面的代码中,我不明白为什么在使用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)。所以只是为了避免进一步的子类化,尽管违背我的意愿,我宣布类最终

swift swift5

5
推荐指数
1
解决办法
1714
查看次数