求战狼2百度云资源贴吧云

原文地址:/swift/25.html
一、解决问题
Swift项目需要使用封装好的Objective-c组件、第三方类库,苹果提供的解决方案能够处理日常大部分需求,但还不能称之为完美,混编过程中会遇到很多问题。本文将Swift兼容Objective-c的问题汇总,以帮助大家更好的使用Swift,内容列表如下:
1. Swift调用Objective-c代码
2. Objective-c调用Swift代码
3. Swift兼容Xib/Storyboard
4. Objective-c巧妙调用不兼容的Swift方法
5. 多Target编译错误解决
6. 第三方类库支持
二、基础混合编程
Swift与Objective-c的代码相互调用,并不像Objective-c与C/C++那样方便,需要做一些额外的配置工作。无论是Swift调用Objective-c还是Objective-c调用Swift,Xcode在处理上都需要两个步骤:
2.1 Swift调用Objective-c代码
Xcode对于Swift调用Objective-c代码,除宏定义外,其它支持相对完善。
2.1.1 使用Objetvie-c的第一步
告诉Xcode、哪些Objective-c类要使用,新建.h头文件,文件名可以任意取,建议采用&项目名-Bridging-Header.h&命令格式。
Swift之IOS项目,在Xcode6创建类文件,默认会自动选择OS X标签下的文件,这时一定要选择iOS标签下的文件,否则会出现语法智能提示不起作用,严重时会导致打包出错。
2.1.2 第二步,Target配置,使创建的头文件生效
设置Objective-C Bridging Header时,路径要配置正确,例如:创建的名为&ILSwift-Bridging-Header.h&文件,存于ILSwift项目文件夹的根目录下,写法如下:
ILSwift/ILSwift-Bridging-Header.h
当然,在新项目中,直接创建一个Objective-c类,Xcode会提示:
直接选择Yes即可,如果不小心点了其它按钮,可以按照上面的步骤一步一步添加。
2.2 Objective-c调用Swift代码
2.2.1 Objective-c调用Swift代码两个步骤
第一步告诉Xcode哪些类需要使用(继承自NSObject的类自动处理,不需要此步骤),通过关键字@objc(className)来标记
import&UIKit
@objc(ILWriteBySwift)
class&ILWriteBySwift&{
&&&&var&name:&String!
&&&&class&func&newInstance()&-&&ILWriteBySwift&{
&&&&&&&&return&ILWriteBySwift()
第二步引入头文件,Xcode头文件的命名规则为
$(SWIFT_MODULE_NAME)-Swift.h
示例如下:
#import&"ILSwift-Swift.h"
不清楚SWIFT_MODULE_NAME可通过以下步骤查看
2.2.2找不到$(SWIFT_MODULE_NAME)-Swift.h
1.遇到此问题可按以下步骤做常规性检查
确定导入SWIFT_MODULE_NAME)-Swift.h头文件的文件名正确
SWIFT_MODULE_NAME)-Swift.h在clean后没有重新构建,执行Xcode-&Product-&Build
2.头文件循环
在混合编程的项目中,由于两种语言的同时使用,经常会出现以下需求:在Swift项目中需要使用Objectvie-c写的A类,而A类又会用到Swift的一些功能,头文件的循环,导致编译器不能正确构建$(SWIFT_MODULE_NAME)-Swift.h,遇到此问题时,在.h文件做如下处理
@class&ILSwiftB
在Objevtive-c的.m文件最上面,添加
#import&"ILSwift-Swift.h"
出现Use of undecalared identifier错误或者找不到方法,如下:
引起的原因有以下几种可能:
使用的Swift类不是继承自NSObject,加入关键字即可
SWIFT_MODULE_NAME)-Swift.h没有实时更新,Xcode-&Product-&Build
此Swift文件中使用了Objective-c不支持的类型或者语法,如private
出现部分方法找不到的问题,Xcode无智能提示:
此方法使用了Objective-c不支持的类型或者语法
苹果官方给出的不支持转换的类型
Enumerations defined in Swift
Structures defined in Swift
Top-level functions defined in Swift
Global variables defined in Swift
Typealiases defined in Swift
Swift-style variadics
Nested types
Curried functions
三、Xib/StoryBoard支持
Swift项目在使用Xib/StoryBoard时,会遇到两种不同的问题
Xib:不加载视图内容
Storyboard:找不到类文件
3.1 Xib不加载视图内容
在创建UIViewController时,默认选中Xib文件,在Xib与类文件名一致时,可通过以下代码实例化:
let&controller&=&ILViewController()
运行,界面上空无一物,Xib没有被加载。解决办法,在类的前面加上@objc(类名),例如: &
import&UIKit
@objc(ILViewController)
class&ILViewController:&UIViewController&{
StoryBoard中创建的UIViewController,不需要@objc(类名)也能够保持兼容&
3.2 Storyboard找不到类文件
Swift语言引入了Module概念,在通过关键字@objc(类名)做转换的时候,由于Storboard没有及时更新Module属性,会导致如下两种类型错误:
3.2.1 用@objc(类名)标记的Swift类或者Objective-c类可能出现错误:
11:27:42.626 ILSwift[] Unknown class _TtC7ILSwift33ILNotFindSwiftTagByObjcController in Interface Builder file.
解决办法,按下图,选中Module中的空白,直接回车
3.2.2 无@objc(类名)标记的Swift类
&11:36:29.788&ILSwift[]&Unknown&class&ILNotFindSwiftController&in&Interface&Builder&file.
解决办法,按下图,选择正确的Module
3.产生上面错误的原因: 在设置好Storyboard后,直接在类文件中,添加或者删除@objc(类名)关键字,导致Storyboard中 Module属性没有自动更新,所以一个更通用的解决办法是,让Storyboard自动更新Module,如下:
3.3 错误模拟Demo下载
为了能够让大家更清楚的了解解决流程,将上面的错误进行了模拟,想动手尝试解决以上问题的同学可以直接下载demo
四、Objective-c巧妙调用不兼容的Swift方法
在Objective-c中调用Swift类中的方法时,由于部分Swift语法不支持转换,会遇到无法找到对应方法的情况,如下:
import&UIKit
enum&HTTPState&{
&&&&case&Succed,&Failed,&NetworkError,&ServerError,&Others
class&ILHTTPRequest:&NSObject&{
&&&&class&func&requestLogin(userName:&String,&password:&String,&callback:&(state:&HTTPState)&-&&(Void))&{
&&&&&&&&dispatch_async(dispatch_get_global_queue(0,&0),&{&()&-&&Void&in
&&&&&&&&&&&&NSThread.sleepForTimeInterval(3)
&&&&&&&&&&&&dispatch_async(dispatch_get_main_queue(),&{&()&-&&Void&in
&&&&&&&&&&&&&&&&callback(state:&HTTPState.Succed)
&&&&&&&&&&&&})
&&&&&&&&})
对应的$(SWIFT_MODULE_NAME)-Swift.h文件为:
SWIFT_CLASS("_TtC12ILSwiftTests13ILHTTPRequest")
@interface&ILHTTPRequest&:&NSObject
-&(SWIFT_NULLABILITY(nonnull)&instancetype)init&OBJC_DESIGNATED_INITIALIZER;
从上面的头文件中可以看出,方法requestLogin使用了不支持的Swift枚举,转换时方法被自动忽略掉,有以下两种办法,可以巧妙解决类似问题:
4.1 用支持的Swift语法包装
在Swift文件中,添加一个可兼容包装方法wrapRequestLogin,注意此方法中不能使用不兼容的类型或者语法
import&UIKit
enum&HTTPState:&Int&{
&&&&case&Succed&=&0,&Failed&=&1,&NetworkError&=&2,&ServerError&=&3,&Others&=&4
class&ILHTTPRequest:&NSObject&{
&&&&class&func&requestLogin(userName:&String,&password:&String,&callback:&(state:&HTTPState)&-&&(Void))&{
&&&&&&&&dispatch_async(dispatch_get_global_queue(0,&0),&{&()&-&&Void&in
&&&&&&&&&&&&NSThread.sleepForTimeInterval(3)
&&&&&&&&&&&&dispatch_async(dispatch_get_main_queue(),&{&()&-&&Void&in
&&&&&&&&&&&&&&&&callback(state:&HTTPState.Succed)
&&&&&&&&&&&&})
&&&&&&&&})
&&&&class&func&wrapRequestLogin(userName:&String,&password:&String,&callback:&(state:&Int)&-&&(Void))&{
&&&&&&&&self.requestLogin(userName,&password:&password)&{&(state)&-&&(Void)&in
&&&&&&&&&&&&callback(state:&state.rawValue)
对应的$(SWIFT_MODULE_NAME)-Swift.h文件为:
SWIFT_CLASS("_TtC12ILSwiftTests13ILHTTPRequest")
@interface&ILHTTPRequest&:&NSObject
+&(void)wrapRequestLogin:(NSString&*&__nonnull)userName&password:(NSString&*&__nonnull)password&callback:(void&(^&__nonnull)(NSInteger))
-&(SWIFT_NULLABILITY(nonnull)&instancetype)init&OBJC_DESIGNATED_INITIALIZER;
此时,我们可以在Objective-c中直接使用包装后的方法wrapRequestLogin
4.2 巧妙使用继承
使用继承可以支持所有的Swift类型,主要的功能在Objective-c中实现,不支持的语法在Swift文件中调用,例如,ILLoginSuperController做为父类
@interface&ILLoginSuperController&:&UIViewController
@property&(weak,&nonatomic)&IBOutlet&UITextField&*userNameF
@property&(weak,&nonatomic)&IBOutlet&UITextField&*passwordF
-&(IBAction)loginButtonPressed:(id)
@implementation&ILLoginSuperController
-&(IBAction)loginButtonPressed:(id)sender
创建Swift文件,继承自ILLoginSuperController,在此Swift文件中调用那些不支持的语法
import&UIKit
class&ILLoginController:&ILLoginSuperController&{
&&&&override&func&loginButtonPressed(sender:&AnyObject!)&{
&&&&&&&&ILHTTPRequest.requestLogin(self.userNameField.text,&password:&self.passwordField.text)&{&(state)&-&&(Void)&in
&&&&&&&&&&&&
五、多Target编译错误解决
在使用多Target时,会出现一些编译错误
5.1 Use of undeclared type
此类错误,是因为当前运行的Target找不到必须编译文件。将文件添加到Target即可,如下支持ILSwiftTests Target,选中ILSwiftTests前的复选框即可
5.2 does not have a member named
此类错误可能由于如下两种原因引起,解决办法同上:
1.此方法来自父类,父类文件没有加入到当前Target
2.此方法来自扩展,扩展没有加入到当前Target
如果检查发现,所有的类文件都已经准确添加到Target中,但编译还是不通过,此时着重检查桥接文件是否正确设置,是否将相应的头文件加入到了桥接文件中。如无特别要求,建议将所有Target的桥接文件全都指向同一文件。关于桥接文件的设置,请参考2.1
六、第三方类库支持
Swift项目取消了预编译文件,一些第三方Objective-c库没有导入必要框架(如UIKit)引起编译错误
6.1 Cocoapods找不到.o文件
在使用了Cocoapods项目中,会出现部分类库的.o文件找不到,导致此种错误主要是以下两种问题:
类库本身存在编译错误
Swift没有预编译,UIKit等没有导入
将此库文件中的代码文件直接加到项目中,编译,解决错误。
6.2 JSONModel支持
在Swift中可以使用JSONModel部分简单功能,一些复杂的数据模型建议使用Objevtive-c
import&UIKit
@objc(ILLoginBean)
public&class&ILLoginBean:&JSONModel&{
&&&&var&userAvatarURL:&NSString?
&&&&var&userPhone:&NSString!
&&&&var&uid:&NSString!
在Swift使用JSONModel框架时,字段只能是NSFoundation中的支持类型,Swift下新添加的String、Int、Array等都不能使用
6.3 友盟统计
Swift项目中引入友盟统计SDK会出现referenced from错误:
解决办法,找到Other Linker Flags,添加-lz
现在大部分成熟的第三方框架都是使用Objective-c写的,开发时不可避免的涉及到两种语言的混合编程,期间会遇到很多奇怪的问题。因为未知才有探索的价值,Swift的简洁快速,能够极大的推进开发进度。所以从今天开始,大胆的开始尝试。
阅读(...) 评论()它们吃的都是官粮,有的动物伙食标准比我们高得多。
从村民家借来梯子,司机才拿着手机爬了出来。
声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
  开篇先提几个问题:1.作为android开发者,android还没搞明白是咋回事,咋跑去学iOS开发了?
  答:劳资喜欢,你管得着吗?
  2.现在学习iOS开发是学swift还是OC?为啥?答:Swift,发明OC的人多半是从火星来的,我讨厌一切带有头文件的语言。
  3.现在大部分公司的项目还都是OC写的,只学Swift找不到工作怎么办?答:找不到工作关我屁事?还有,我让你只学Swift了吗?
  4.Swift现在还在快速发展中,语法会不断变化,会不会不利于维护?答:MD,哪来这么多问题,爱学学,不学拉倒。
  这是一篇关于一个android程序猿学习iOS开发的过程的记录和心得,主要是总结一下学习经验,希望能帮助到想学习iOS开发的小伙伴。首先学习iOS开发必需品: 苹果电脑,互联网,和一个百折不挠的你 。注意!是百折不挠的你。
  硬件选择 MacBook 系列,不差钱的可选性能好价格高的,有经济压力的可以选择 Mac mini。不要去装什么黑苹果,虚拟机,相信我,那会浪费你很多时间的。开发环境 Xcode 7.*,就是Mac自带的 App store 里下载就可以,我自己使用的是Xcode 7.3 beta3
  Github 这是全球最大的同性交友社区,如果你爱上了这里,那么恭喜你,你将会受益匪浅。其次,开发iOS应用当然要注册苹果开发者账号,具体事宜就不多说了,你可能会问,不需要买个iPhone吗?
  作为一个初学者,Xcode的模拟器足够用了。Ok,万事俱备,现在可以心无旁骛,一心coding了。如何学习Swift语言其实在swift刚刚发布的时候,我就开始了解swift了,苹果官方发布了 Swift 系列教程之后,国内就有一帮热心的小伙伴翻译成了中文,现在已经是swift2.1版本了,知道你们都懒,链接拿去《The Swift Programming Language》中文版 ,不过英文水平好的同学建议直接阅读英文原版。我学习swift语言的时候是看的liuyubobobo老师的玩转swift。
  基于swift1.2录制的,老师讲得很好,再加上自己看书,动手练习,慢慢的也就基本掌握了swift的语法。这里要强调一下,我认为学习一门计算机语言最好的方式就是敲代码,去运用它,先把基本语法熟悉了,然后开始实战项目,去提升自己的编码水平,加深对语言的理解。总之就是一个字,敲。
  Xcode如何使用对于学习如何使用工具的问题,你去买本iOS开发教程基本都会有图文教学的,不过,这种事情,我还是以为视频更好,毕竟比图文多了声音,比图文更加生动形象,能够加深自己的印象。林永坚Jake老师的使用Swift开发iOS8 App实战是一个很好的学习视频,都是一些小例子。
  学完之后不仅了解了iOS中一些基本控件的用法,对Xcode的操作也能算是熟练了吧。如何打造自己的第一款 iOS app好了,这个时候你可能已经掌握了swift的基本语法,和Xcode的基本用法,以及如何用MainStoryBoard来组织app界面了,你可能已经按捺不住内心的激动,迫切的想打造一款属于自己的app了,别着急,冷静一下,不要膨胀。
  第一个选择,去github上面找一些简单的小例子,fork别人的项目。注意,是超级简单的那种,不要问我为什么,复杂的你看得懂吗?看看一个完整的项目是怎么写的。比如说一个简单的天气预报程序,大都是入门必备神器吧,自己也跟着别人的代码敲一遍。找一下独立开发app的感觉。
  第二个选择,你比较有想象力,有了自己的一些想法,想自己做个app,建议你先看一看Kevin大神的给女朋友的iOS开发教程,还可以再看一看他的《producter》,相信这对你会有很大的帮助。看完你觉得自己梦想就要实现了,甚至可以改变世界了。你甚至已经在sketch里面设计你的app了,一切都是那么顺利的进行着。
  ok,这个时候你可能已经在Xcode里面新建项目了,相信我,噩梦即将来临,Xcode可不会轻易宽容你的错误。当你真正开始写项目的时候,你会发现很多问题,有些很简单的问题你甚至要花上一天去解决。
  卧槽,这个库怎么无法导入项目?readme里就是这么写的啊,这个地方怎么和书上写的不一样?我的操作没有错啊,为什么会奔溃…诸如此类的问题。这个时候,我们就需要Google这种神器了,什么?访问不了?自己找梯子去。
  相信我,你遇到的绝大部分的问题都能在这里找到答案。那找不到答案的呢?那就要看你自己有没有灵性了。所有的过程中这个阶段是最难熬的,只要你能克服一切困难,不抛弃,不放弃。
  把自己的想法实现了,你就成功的成为了一名iOS开发者了。并且你有了一款属于自己的app,可以拿去跟朋友们分(zhuang)享(bi)了。以上就是我学习iOS开发的全部过程了,不过还是要偷偷的告诉你们,我在学习swift之前偷偷的学过OC,只是不喜欢他的语法风格就搁到一边了。
  虽然我不能写OC的代码,但是我基本看得懂别人写的OC代码,所以在使用一些用OC写的库的时候还是很顺手的。你看,多学一点总是好的。人一辈子那么长,不要总是拿来吃饭睡觉打游戏,偶尔看看电影也是可以的嘛。
  蓝鸥iOS开发,国内口碑最好的,我们是 一群热爱IT的年轻人,如果你也爱IT、爱iOS开发,欢迎前来蓝鸥iPhone培训中心参观学习,让我们共同为梦想发声。详情请咨询官方网站。
欢迎举报抄袭、转载、暴力色情及含有欺诈和虚假信息的不良文章。
请先登录再操作
请先登录再操作
微信扫一扫分享至朋友圈
搜狐公众平台官方账号
生活时尚&搭配博主 /生活时尚自媒体 /时尚类书籍作者
搜狐网教育频道官方账号
全球最大华文占星网站-专业研究星座命理及测算服务机构
培养iOS高级工程师、html5高级工程师及拥有自主研发的...
主演:黄晓明/陈乔恩/乔任梁/谢君豪/吕佳容/戚迹
主演:陈晓/陈妍希/张馨予/杨明娜/毛晓彤/孙耀琦
主演:陈键锋/李依晓/张迪/郑亦桐/张明明/何彦霓
主演:尚格?云顿/乔?弗拉尼甘/Bianca Bree
主演:艾斯?库珀/ 查宁?塔图姆/ 乔纳?希尔
baby14岁写真曝光
李冰冰向成龙撒娇争宠
李湘遭闺蜜曝光旧爱
美女模特教老板走秀
曝搬砖男神奇葩择偶观
柳岩被迫成赚钱工具
大屁小P虐心恋
匆匆那年大结局
乔杉遭粉丝骚扰
男闺蜜的尴尬初夜
客服热线:86-10-
客服邮箱:新手,想请教一下ios的界面开发方式,是拖控件还是写代码_swift吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:32,890贴子:
新手,想请教一下ios的界面开发方式,是拖控件还是写代码收藏
以前是搞Android开发的,现在开始学ios,以前完全没接触过,想请教一下,ios的界面开发是拖控件还是oc代码,或者是像Android开发一样把界面代码以配置的形式写在布局文件里
缺牙要及时修复,揭秘种植牙如何做到几十年不掉?
看了2天oc,现在oc已经掌握的差不多了,但是开始看ios开发的部分,完全搞不懂啊,全是拖控件开发界面,实际开发中应该不是通过拖控件来开发界面吧
并没有沉,只是贴吧气氛不活跃而已。开发模式这个没有标准,公司以效率为第一位,只要能更快的达到目的,你用什么办法这个没太大关系。不过还是建议从代码开始,毕竟storyboard无非就是个代码自动生成的过程
我现在开发就用了storyboard,用storyboard的清楚的看清整个框架及每个页面对应关系。能用storyboard就用storyboard(leader要求)
纯代码手敲
其实实际也能拖吧 毕竟苹果分辨率比较统一
不管oc还是swift,都是语法。做移动端的应用,都是给直接客户操作的,都是操作的界面,所以真用oc/swift开发时,要用提供的框架。界面开发现在都是所见即所得,直接拖上去,但要灵活的话,还得用代码操作。
我也喜欢经常拖控件,但是遇到了一个bug,就是控件有时候拖不进代码里。只能转手敲了
一起使用,比如button就可以直接拖,但是像alterview就需要靠代码实现了。结合实际情况选择吧
派学车作为一家全国连锁的互联网驾培企业,是怎么样保证服务的呢?
楼主还是主安卓吧,懂iOS就行了。现在iOS培训大把,明年iOS工资绝对低于安卓
各有优缺点,快速原型的时候一般会拖到storyboard里面。团队合作还是建议代码。要不合并代码时候storyboard的冲突能搞死人
都一样,控件都会再转换成代码,还是写代码好些,
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或

我要回帖

更多关于 战狼2百度网盘 的文章

 

随机推荐