当前位置: 首页 > 面试题库 >

在目标C中不可见的快速初始化

汝吕恭
2023-03-14
问题内容

我正在尝试在中创建init函数Swift并从中创建实例Objective-C。问题是我在Project- Swift.h文件中看不到它,并且在初始化时找不到该函数。我有一个定义如下的函数:

public init(userId: Int!) {
    self.init(style: UITableViewStyle.Plain)
    self.userId = userId
}

我什至尝试放入推杆@objc(initWithUserId:),但再次出现相同的错误。还有什么我想念的吗?如何使构造函数对Objective-C代码可见?

我为此阅读以下内容:

https://developer.apple.com/library/ios/documentation/swift/conceptual/swift_programming_language/Initialization.html

https://developer.apple.com/library/ios/documentation/swift/conceptual/buildingcocoaapps/interactingwithobjective-
capis.html


问题答案:

您看到的问题是,Swift无法桥接可选值类型-这Int是一种值类型,因此
Int!无法桥接。可选引用类型(即任何类)都可以正确桥接,因为它们始终可以nil在Objective-
C中使用。您的两个选择是使参数成为非可选参数,在这种情况下,它将作为int或桥接到ObjC NSInteger

// Swift
public init(userId: Int) {
    self.init(style: UITableViewStyle.Plain)
    self.userId = userId
}

// ObjC
MyClass *instance = [[MyClass alloc] initWithUserId: 10];

或使用可选NSNumber?,因为可以将其桥接为可选值:

// Swift
public init(userId: NSNumber?) {
    self.init(style: UITableViewStyle.Plain)
    self.userId = userId?.integerValue
}

// ObjC
MyClass *instance = [[MyClass alloc] initWithUserId: @10];    // note the @-literal

但是请注意,您实际上并没有像对待可选参数那样对待参数-除非self.userId也是可选参数,否则您将自己设置为可能会导致运行时崩溃。



 类似资料:
  • 当我将一个对象放到场景中时,通过变形目标重新调整他的大小,如本例所示: https://threejsdoc.appspot.com/doc/three.js/examples/webgl_morphtargets.html 当我将相机移出对象的原始大小,但仍在查看重新调整大小的部分时,对象消失了。 这意味着,当我拉伸盒子100次时,我仍然需要看他原来的中心,当我只看他重新调整大小的部分时,它就不

  • 本文旨在描述如何在 Kubernetes 快速开始安装和配置 Istio。 SOFA Mosn 不仅可以支持 Istio 标准的部署模式,也能支持单方面的 Inbound Sidecar,Outbound Sidecar的部署模式,满足用户的各种需求。 前置要求 Kubernetes 安装 Helm 安装步骤 Step 1. 下载最新的 release 包 Step 2. 把 Istio 的 bi

  • 启动项目(请先完成环境依赖安装) 克隆项目 执行 => composer install (如果安装很慢,可以使用国内镜像,但是镜像包会有延迟) 新建一个runtime目录,用于存放日志等cache文件 配置config中的database配置文件 设置config/service.php中的registry_address.目前只支持redis、mysql作为注册中心 启动http server

  • 问题内容: 当我这样做时,从编译器得到投诉 但是,如果我只添加 ? 在如下所示的 AppDelegate 末尾,错误消失了。 除非我错了,否则我看不到与此错误相关的关键字。 问题答案: 该错误可以得到改善,但是第一个版本的问题是您有一个成员变量,该成员变量没有默认值。Swift中的所有变量必须始终具有一个值。这意味着您必须在没有的初始化程序中进行设置,也可以在线提供默认值。 当您将其设为可选时,默

  • 我最近在我的android应用程序中部署了Google map API。问题是,在用户滚动/浏览部署地图片段的视图之前,放置在地图上的标记不可见。 问题是“如何在初始化时将Google地图集中到特定位置的标记上。 编辑时间: 2017年8月25日 我已经在下面的博客文章中为特定位置放置了标记 问题 当用户看到地图时,我试图直接查看我的标记。而不是通过滚动地图来查看标记。

  • 问题内容: 假设我有两个类:基类和子类,如下所示: 当调用子类的反初始化器时,是否调用nil来给变量赋值?还是我必须在子类的反初始化器中手动分配? 问题答案: 您可以选择在子类中包含一个内部。 如果你这样做 您会看到首先被调用是内部调用,然后 被调用。所以是,但在子类之后被调用。 该书还说(第286页): 您不允许自己调用反初始化程序。超类反初始化器由其子类继承,并且超类反初始化器在子类反初始化器