我正在使用信号库.
假设我定义了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)
我收到错误:
但是我可以编写下一行而没有任何编译器错误:
var arrays = Array<Array<BaseProtocol>>()
let arrayOfChild = Array<ChildClass>()
arrays.append(arrayOfChild)
Run Code Online (Sandbox Code Playgroud)
那么,通用Swift数组和通用信号之间的区别是什么?
这是我的代码:
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)
第二个闭包有一个泛型类型对象数组的参数有什么问题?
为什么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) NSNumber引用类型,例如Int32,UInt32,Int64和UInt64类型?具体来说,复制下面介绍的自动按配置桥接.此类解决方案的示例用法:
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....
雨燕自动填补某些本地号码类型,如
Int和Float,对NSNumber.此桥接允许您NSNumber从以下类型之一创建 : …
我怎么能这样做?
var dict = [AnyHashable : Int]()
dict[NSObject()] = 1
dict[""] = 2
Run Code Online (Sandbox Code Playgroud)
这意味着,NSObject和String在某种程度上一个亚型的AnyHashable却AnyHashable是struct这样,他们怎么允许这样做?
我想通过匹配数组类型来使用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上测试过
我正在尝试这种技术:
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?
以下是有效的代码:
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?