我们考虑以下代码:
protocol A {
func doA()
}
extension A {
func registerForNotification() {
NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardDidShow:"), name: UIKeyboardDidShowNotification, object: nil)
}
func keyboardDidShow(notification: NSNotification) {
}
}
Run Code Online (Sandbox Code Playgroud)
现在看一下实现A的UIViewController子类:
class AController: UIViewController, A {
override func viewDidLoad() {
super.viewDidLoad()
self.registerForNotification()
triggerKeyboard()
}
func triggerKeyboard() {
// Some code that make key board appear
}
func doA() {
}
}
Run Code Online (Sandbox Code Playgroud)
但令人惊讶的是,这会因错误而崩溃:
keyboardDidShow:]:无法识别的选择器发送到实例0x7fc97adc3c60
那么我应该在视图控制器本身中实现观察者吗?不能留在延期?
以下事情已经尝试过.
制作A类协议.将keyboardDidShow添加到协议本身作为签名.
protocol A:class {
func doA()
func keyboardDidShow(notification: NSNotification)
}
Run Code Online (Sandbox Code Playgroud) 表示使用swift中的结构实现的数字,字符和字符串的类型.
摘自官方文件:
通常在其他语言中被认为是基本或原始的数据类型(例如表示数字,字符和字符串的类型)实际上是命名类型,使用结构在Swift标准库中定义和实现.
这是否意味着以下内容:
Int
Float
String
// etc
Run Code Online (Sandbox Code Playgroud)
......不被视为原始人?
我应该如何Observable
在RxSwift中合并两种不同类型的s?
例如:
var a: Observable<Int>
var b: Observable<Void>
Run Code Online (Sandbox Code Playgroud)
Observable.of(a,b).merge()
因类型参数不同而无法实现.
请考虑以下示例.
struct AStruct{
var i = 0
}
class AClass{
var i = 0
var a: A = A(i: 8)
func aStruct() -> AStruct{
return a
}
}
Run Code Online (Sandbox Code Playgroud)
如果我尝试改变类实例的变量,AClass
它会成功编译.
var ca = AClass()
ca.a.i = 7
Run Code Online (Sandbox Code Playgroud)
但是如果我试图改变aStruct
方法的返回值,编译就会尖叫
ca.aStruct().i = 8 //Compile error. Cannot assign to property: function call returns immutable value.
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下吗.
Swift文档明确指出.
与Objective-C初始值设定项不同,Swift初始值设定项不返回值.
请解释下面的语法.
let instanceOfString = String()
Run Code Online (Sandbox Code Playgroud)
它通过调用初始化程序并返回它来初始化String对象.值被分配给instanceOfString
.不是吗?