相关疑难解决方法(0)

Swift中的NSObject子类:hash vs hashValue,isEqual vs ==

在Swift中继承NSObject时,你应该覆盖哈希还是实现Hashable?另外,你应该覆盖isEqual:或者实现==?

cocoa swift

38
推荐指数
2
解决办法
1万
查看次数

调用Swift协议扩展方法而不是在子类中实现的方法

我遇到了一个问题,在下面的代码(Swift 3.1)中解释:

protocol MyProtocol {
    func methodA()
    func methodB()
}

extension MyProtocol {
    func methodA() {
        print("Default methodA")
    }

    func methodB() {
        methodA()
    }
}

// Test 1
class BaseClass: MyProtocol {

}

class SubClass: BaseClass {
    func methodA() {
        print("SubClass methodA")
    }
}


let object1 = SubClass()
object1.methodB()
//

// Test 2
class JustClass: MyProtocol {
    func methodA() {
        print("JustClass methodA")
    }
}

let object2 = JustClass()
object2.methodB()
//
// Output
// Default methodA
// JustClass methodA
Run Code Online (Sandbox Code Playgroud)

所以我希望在调用后打印"SubClass …

protocols swift

19
推荐指数
1
解决办法
3528
查看次数

为什么Self和self有时会在静态函数中引用不同的类型?

最近,我一直在使用Swift开发多个面向协议的应用程序框架,并注意到协议扩展中有一些(看似)奇怪的静态函数行为,特别是从元类型调用扩展函数的情况.

我最初发现这些行为的方式是对一个错误进行故障排除,其中一个对象的类型以一种看似不可能的方式发生了变化.我追查了问题并最终确定这是因为在静态函数中,Self并且self可能存在不同的类型(注意:我已经分别称这些为"Big S Self"和"Little s self").我将用我在游乐场中掀起的一些简单的例子来证明这一点:

class SomeBaseClass: SomeProtocol {}

class SomeChildClass: SomeBaseClass {}

protocol SomeProtocol {}

extension SomeProtocol {
    static private func getName() -> String {
        return "\(self): \(type(of: self))"
    }

    static func ambiguousName() -> String {
        return getName()
    }

    static func littleName() -> String {
        return self.getName()
    }

    static func bigName() -> String {
        return Self.getName()
    }
}

let child: SomeBaseClass.Type = SomeChildClass.self // SomeChildClass.Type

print(child.ambiguousName())          // "SomeChildClass: SomeBaseClass.Type\n"
print(child.littleName())             // "SomeChildClass: SomeBaseClass.Type\n"
print(child.bigName()) …
Run Code Online (Sandbox Code Playgroud)

swift swift-protocols swift3

12
推荐指数
1
解决办法
1226
查看次数

如何覆盖协议扩展的func的默认实现?

是否可以获取以下代码来生成MyClass2:someFuncWithDefaultImplementation()被调用?

protocol MyProtocol : class {
    func someFuncWithDefaultImplementation()
    func someFunc()
    var  someInt:Int { get set }
}

extension MyProtocol {
    func someFuncWithDefaultImplementation() {
        someInt = 5
    }

    func someFunc() {
        someFuncWithDefaultImplementation()
    }
}

class MyClass :  MyProtocol {
    var someInt = 6
}

class MyClass2 : MyClass
{
    func someFuncWithDefaultImplementation()
    {
        someInt = 7
    }
}


...

  let class2 = MyClass2()
  class2.someFunc()
Run Code Online (Sandbox Code Playgroud)

MyClass2可以添加此方法:

func someFunc() {
       someFuncWithDefaultImplementation()
}
Run Code Online (Sandbox Code Playgroud)

它可以工作,但是如果MyProtocol:someFunc()除了调用someFuncWithDefaultImplementation()之外还做其他事情就没有用,因为它只是代码重复.

这样做也没有达到预期的效果:

extension MyClass2 {
    func someFuncWithDefaultImplementation()
    {
        someInt = 7
    } …
Run Code Online (Sandbox Code Playgroud)

swift

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

标签 统计

swift ×4

cocoa ×1

protocols ×1

swift-protocols ×1

swift3 ×1