加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Swift迁移常见问题

发布时间:2020-12-14 02:05:14 所属栏目:百科 来源:网络整理
导读:Swift语法问题 如何声明一个类的delegate属性?(Liushuai) weak var delegate : UITableViewDelegate ? 其他optional的属性如果需要弱引用也同样是用weak关键词修饰。 如果不是optional属性,需要弱引用时应使用unowned。 如何使用宏?(Selengge) Swift

Swift语法问题

  • 如何声明一个类的delegate属性?(Liushuai)
weak var delegate : UITableViewDelegate?

其他optional的属性如果需要弱引用也同样是用weak关键词修饰。

如果不是optional属性,需要弱引用时应使用unowned。

  • 如何使用宏?(Selengge)

Swift不支持头文件或pch文件中定义的宏。旧代码中以宏方式实现的开关或函数等,应在GlobalFunctions.swift中重新定义。如检测是否iPad环境的方法由旧代码的IS_PAD宏变为新的NaviAppIsPad()函数。

需要注意的是,编译器开关在Swift中是可以判断的,例如:

// Objective-C #ifdef DEBUG ...
#else ...
#endif 
// Swift #if DEBUG
...
#else
#end
  • 调用类似addTarget(target: AnyObject?,action: Selector,forControlEvents controlEvents: UIControlEvents)之类的方法时,selector应如何填写?(haoyun)

selector类型可以用Selector类的构造函数创建,在这里也可以直接写方法签名字符串。需要注意的是,方法签名字符串是Objective-C的格式。

  • 为何创建自己写的UIViewController子类对象时出现编译器错误“missing argument for paramter 'coder' in call”?(haoyun)

需要注意designated initializer在Swift中是强制的,子类继承时一定要注意继承并调用正确的父类构造方法。UIViewController的designated initializer是init(nibName: bundle:)方法,因此子类不但需要实现init(coder:),也需要继承init(nibName: bundle:)。创建UIViewController子类的实例时,不能使用无参数的初始化方法。

// 实现init方法     override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {

        titleLabel = UILabel(frame: CGRectZero)

        super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)

        titleLabel.text = "增强电子眼"
        self.viewaddSubview(titleLabel)
    }

    // 调用init方法     var eEyeVC ElectronicEyeViewController(nibName: nil, bundle: nil)

Swift -> Objective-C 问题

  • 为什么我在Swift中声明的类,在Objective-C中无法引用?(Selengge)

首先需要检查ObjC文件中是否引用了Swift转ObjC的头文件。

#import "OnlineNavigation-Swift.h"

其次,Swift类要在Objective-C中使用,必须满足两个条件其一: a. 有@objc前缀 b. 是继承自ObjC类(如UIView或NSObject)

在混合工程内,不推荐使用Swift默认的无父类声明(即只使用@objc修饰),除非这个类只会被Swift代码调用。一般应至少继承NSObject,原因是这样可以让对象带上id中的若干方法及其默认实现,如responsesToSelector:,方便ObjC代码使用。

  • 为什么以下这个Swift实例方法在Objective-C中看不到也无法调用? (Liushuai)
func retrieveListWithHandler(handler:((array:NSArray?, flag:Bool!) -> Void)?){

        handler?(array: NSArray(),flag: true)
    }

原因:Swift中的可选对象类型(NSArray?)对应ObjC中的普通指针(NSArray *),但Swift中的可选值类型(Bool!)在ObjC中没有对应的类型可用,因此该方法无法暴露给ObjC。将Bool!类型改为Bool类型后,问题解决。

注释问题

  • 如何使用类似ObjC中pragma mark的功能?(Selengge)
// MARK: - this is a title 
  • 如何使用类似ObjC中@brief、@returns等文档修饰符?(Selengge)

Swift注释默认进入方法和属性的Description标签,不需要写@brief。其他修饰符也有对应的关键词,如@returns在Swift注释里的写法是:returns:。

此外,在Swift中为方法和属性添加说明时,应使用/** */或者///作为注释头尾。

/**
 *    这是一个测试类此说明会出现在description中
 *    :note: 一些额外说明
 *    :param: param1 一号参数
 *    :returns: 返回值的说明
 */

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读