相关疑难解决方法(0)

斯威夫特通用强制误解

我正在使用信号库.

假设我定义了BaseProtocol协议并且ChildClass符合哪种协议BaseProtocol.

protocol BaseProtocol {}
class ChildClass: BaseProtocol {}
Run Code Online (Sandbox Code Playgroud)

现在我想存储信号,如:

var signals: Array<Signal<BaseProtocol>> = []
let signalOfChild = Signal<ChildClass>()
signals.append(signalOfChild)
Run Code Online (Sandbox Code Playgroud)

我收到错误:

Swift通用错误

但是我可以编写下一行而没有任何编译器错误:

var arrays = Array<Array<BaseProtocol>>()
let arrayOfChild = Array<ChildClass>()
arrays.append(arrayOfChild)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

那么,通用Swift数组和通用信号之间的区别是什么?

generics swift

10
推荐指数
1
解决办法
772
查看次数

Swift Generics:无法将类型的值转换为预期的参数类型

这是我的代码:

protocol SomeProtocol {
}

class A: SomeProtocol {
}

func f1<T: SomeProtocol>(ofType: T.Type, listener: (T?) -> Void) {
}

func f2<T: SomeProtocol>(ofType: T.Type, listener: ([T]?) -> Void) {
}

func g() {
    let l1: (SomeProtocol?) -> Void = ...
    let l2: ([SomeProtocol]?) -> Void = ...
    f1(ofType: A.self, listener: l1) // NO ERROR
    f2(ofType: A.self, listener: l2) // COMPILE ERROR: Cannot convert value of type '([SomeProtocol]?) -> Void' to expected argument type '([_]?) -> Void'
}
Run Code Online (Sandbox Code Playgroud)

第二个闭包有一个泛型类型对象数组的参数有什么问题?

generics swift

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

为什么我不能在Swift中使用泛型类的子类?

为什么Swift不允许我为Foo<U>类型的变量赋值Foo<T>,其中U是T的子类?

例如:

class Cheese {
    let smell: Int
    let hardness: Int
    let name: String

    init(smell: Int, hardness: Int, name: String) {
        self.smell = smell
        self.hardness = hardness
        self.name = name
    }

    func cut() {
        print("Peeyoo!")
    }
}

class Gouda: Cheese {
    let aged: Bool

    init(smell: Int, hardness: Int, name: String, aged: Bool) {
        self.aged = aged
        super.init(smell: smell, hardness: hardness, name: name)
    }

    override func cut() {
        print("Smells delicious")
    }
}

class Platter<Food> {
    var food: …
Run Code Online (Sandbox Code Playgroud)

generics subclassing swift

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

对于(U)Int8/16/32/64类型,是否可以将Swifts自动数值桥接复制到Foundation(NSNumber)?

  • 是否有可能复制雨燕数值桥接基金会:■ NSNumber引用类型,例如Int32,UInt32,Int64UInt64类型?具体来说,复制下面介绍的自动按配置桥接.

此类解决方案的示例用法:

let foo : Int64 = 42
let bar : NSNumber = foo
    /* Currently, as expected, error:
       cannot convert value of type 'Int64' to specified type 'NSNumber */
Run Code Online (Sandbox Code Playgroud)

背景

一些原生的Swift数(值)类型可以自动桥接到NSNumber(引用)类型:

迅数字结构类型的实例,例如Int,UInt, Float,Double,和Bool,不能由来表示 AnyObject类型,因为AnyObject仅代表一个类类型的实例.但是,Foundation启用桥接时,可以将Swift数值分配给常量和AnyObject类型的变量 作为类的桥接实例NSNumber.

...

雨燕自动填补某些本地号码类型,如IntFloat,对NSNumber.此桥接允许您NSNumber从以下类型之一创建 : …

nsnumber swift swift2

6
推荐指数
1
解决办法
688
查看次数

Int和String如何被接受为AnyHashable?

我怎么能这样做?

    var dict = [AnyHashable : Int]()
    dict[NSObject()] = 1
    dict[""] = 2
Run Code Online (Sandbox Code Playgroud)

这意味着,NSObjectString在某种程度上一个亚型AnyHashableAnyHashablestruct这样,他们怎么允许这样做?

swift swift3

6
推荐指数
1
解决办法
2632
查看次数

打开阵列类型

概观

我想通过匹配数组类型来使用switch语句.我有以下课程.

类:

class A {}    
class B : A {}
Run Code Online (Sandbox Code Playgroud)

打开单值工作:

let a : A = B()

switch a {
case let b as B:
    print("b = \(b)")
default:
    print("unknown type")
}
Run Code Online (Sandbox Code Playgroud)

打开数组(编译错误):

let aArray : [A] = [B(), B()]

switch aArray {
case let bArray as [B] :
    print("bArray = \(bArray)")
default:
    print("unknown type")
}
Run Code Online (Sandbox Code Playgroud)

错误:

Downcast pattern value of type '[B]' cannot be used
Run Code Online (Sandbox Code Playgroud)

注意:Swift 4上测试过

题:

  • 我怎样才能做到这一点?

switch-statement swift

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

子类是否可以覆盖函数并进行更严格的返回?

我正在尝试这种技术:

class Pet {}

class Dog: Pet {}

class House {
    func getPets() -> [Pet] {
        return [Pet]()
    }
}

class DogHouse: House {
    override func getPets() -> [Dog] {
        return [Dog]()
    }
}
Run Code Online (Sandbox Code Playgroud)

DogHouse类覆盖了House getPets在严格满足的API要求的方式方法House getPets.

但是,Swift不理解[Dog]isa [Pet]并且它会产生错误Method does not override any method from its superclass.

对于子类来说,有什么方法可以使用比其超类更通用的输入或更多限制性输出来实现API?

swift

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

映射函数重铸数组

以下是有效的代码:

let aProvider: () -> [aParticipant] = {
    let results = fetchRequestController.fetchedObjects as! [ParticipantFetchResultsProtocol]

    var newArray: Array<aParticipant> = Array()
    for result in results {
        let obj = result as aParticipant
        newArray.append(obj)
    }

    return newArray
}
Run Code Online (Sandbox Code Playgroud)

使用地图,我尝试过:

var newArray = results.map({aParticipant($0)})
Run Code Online (Sandbox Code Playgroud)

我收到一个错误: aParticipant cannot be constructed because it has no accessible initializers

有没有办法做到这一点map

swift

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