1.Swift找不到OC文件中的方法
上图这个Model类没有引入桥接文件,导致编译器找不到这个类,所以编译器没法通过这个类生成对应的OC方法。把它引入到桥接文件就好了。**
2.OpenShare没有微信回调
解决方案:
到AppDelegate中的application:openURL:sourceApplication:annotation:中添加整体回调:
// 如果OpenShare能处理这个回调,就调用block中的方法,如果不能处理,就交给其他(比如支付宝)。
if ([OpenShare handleOpenURL:url]) {
return YES;
}
OSMessage微信分享提示:应用消息数据错误
解决方案:
1.字段缺失-检查title、desc img 是否缺失
2.link 分享的网址打不开的话,请检查微信后台地址和服务器后台地址是否一致。
let shareMessage = OSMessage()
let img = UIImage(named: "")!
let imgData = img.compress(toData: 1024 * 32)
shareMessage.image = imgData
shareMessage.title = self.remark ?? ""
shareMessage.desc = self.remark ?? ""
shareMessage.link = "https://xxx.api"
OpenShare.share(toWeixinSession: shareMessage, success: { (message) in
print("分享成功")
}) { (message, error) in
print("分享失败")
}
3 iOS 返回到指定控制器
///Swift返回到指定控制器
DispatchQueue.main.async {
///get nav controllers
let controllers: [UIViewController] = self.navigationController!.viewControllers
///get current index of nav
let index = controllers.firstIndex(of: self)
///popTo appointed controller from viewControllers[x],by Debug: *po viewControllers* to find your appointed controller
self.navigationController?.popToViewController(controllers[index! - 2], animated: true)
}
4 'ProjectName-Swift.h' file not found
5 禁止侧滑返回
let target = navigationController?.interactivePopGestureRecognizer?.delegate
let panGeture = UIPanGestureRecognizer(target: target, action: nil)
view.addGestureRecognizer(panGeture)
6
1.delegate为什么用weak?
我们指定delegate为weak ,在代理对象被释放的时候,被重置为nil,这可以保证delegate已经不存在的时候 不会访问已经被回收的内存而造成崩溃。
2.Swift中如何使用weak delegate?
方法一:使用@objc修饰protocol
@objc protocol MyClassDelegate {
func method()
}
方法二:更好的办法是在 protocol 声明的名字后面加上 class,这可以为编译器显式地指明这个 protocol 只能由 class 来实现。
protocol MyClassDelegate: class {
func method()
}
相比起添加 @objc,后一种方法更能表现出问题的实质,同时也避免了过多的不必要的 Objective-C 兼容,可以说是一种更好的解决方式。
3.Lazy的使用、lazy与map/filter的结合延时运行
lazy简单使用:
lazy var str:String = ""
class A{
lazy var str:String = {
let str = "Hiahia"
return str
}
}
相比起在 Objective-C 中的实现方法,现在的 lazy 使用起来要方便得多。 如果我们先进行一次 lazy 操作的话,我们就能得到延时运行版本的容器:
let data = 1...3
let result = data.lazy.map {
(i: Int) -> Int in
print("正在处理 \(i)")
return i * 2
}
print("准备访问结果")
for i in result {
print("操作后结果为 \(i)")
}
print("操作完毕") 此时的运行结果:
// 准备访问结果
// 正在处理 1
// 操作后结果为 2
// 正在处理 2
// 操作后结果为 4
// 正在处理 3
// 操作后结果为 6
// 操作完毕
对于那些不需要完全运行,可能提前退出的情况,使用 lazy 来进行性能优化效果会非常有效。
4.Swift没有NSobject父类,没有isa指针,那Swift底层是如何发送消息的?
- 直接调用函数地址???
- 函数地址存放在内存-代码段中
- 编译链接完就能确定函数地址了,你用到的地方就是直接 call 这个函数地址,这个也是编译链接完就确定了