在Swift中可以吗?如果不是,那么是否有解决方法?
当前回答
如何创建可选和必需的委托方法。
@objc protocol InterViewDelegate:class {
@objc optional func optfunc() // This is optional
func requiredfunc()// This is required
}
其他回答
与最初的问题有点偏离主题,但它建立在安托万的想法上,我想它可能会帮助到一些人。
您还可以为具有协议扩展的结构设置可选的计算属性。
您可以将协议上的属性设置为可选的
protocol SomeProtocol {
var required: String { get }
var optional: String? { get }
}
在协议扩展中实现虚拟计算属性
extension SomeProtocol {
var optional: String? { return nil }
}
现在你可以使用实现或不实现可选属性的结构体
struct ConformsWithoutOptional {
let required: String
}
struct ConformsWithOptional {
let required: String
let optional: String?
}
我还在我的博客上写了如何在Swift协议中执行可选属性,我会不断更新,以防Swift 2发布时情况发生变化。
下面是一个使用委托模式的具体示例。
设置您的协议:
@objc protocol MyProtocol:class
{
func requiredMethod()
optional func optionalMethod()
}
class MyClass: NSObject
{
weak var delegate:MyProtocol?
func callDelegate()
{
delegate?.requiredMethod()
delegate?.optionalMethod?()
}
}
将委托设置为类并实现协议。请注意,不需要实现可选方法。
class AnotherClass: NSObject, MyProtocol
{
init()
{
super.init()
let myInstance = MyClass()
myInstance.delegate = self
}
func requiredMethod()
{
}
}
重要的一点是,可选方法是可选的,在调用时需要“?”。提到第二个问号。
delegate?.optionalMethod?()
在Swift 3.0中
@objc protocol CounterDataSource {
@objc optional func increment(forCount count: Int) -> Int
@objc optional var fixedIncrement: Int { get }
}
这会节省你的时间。
要在swift中定义可选协议,你应该在协议声明和协议中的属性/方法声明之前使用@objc关键字。 下面是协议的可选属性示例。
@objc protocol Protocol {
@objc optional var name:String?
}
//现在,如果尝试在代码中实现该协议,将不会强制在类中包含该函数。
class MyClass: Protocol {
// No error
}
另一种方法是使用协议扩展,我们也可以给出该协议的默认实现。所以协议的功能是可选的。
让我们先来了解一下它们的区别
第一个例子-如果你写UITableViewDataSource,那么你需要强制写两个方法-这是默认协议的快速方式
第二个例子-如果你写UITableViewDelegate,并意识到它不会显示红色错误,请添加所有的委托方法。使用哪种方法取决于你自己。我们可以调用作为可选方法!
让我们通过一个例子来理解
第一种Swift方式默认协议方法
class ContactModel{
var firstname: String?
var lastname: String?
}
protocol ContactDataSource: AnyObject{
func contactConfiguration(contact: ContactModel)
}
class ViewController: ContactDataSource{
func contactConfiguration(contact: ContactModel) {
print(contact)
}
}
第二种方法——可选协议
@objc
class UserModel: NSObject{
var firstname: String = ""
}
@objc protocol UserDataSource{
func contactConfiguration(user: UserModel)
@objc optional func userInfo(user: UserModel)
}
class ViewController: UserDataSource{
func contactConfiguration(user: UserModel) {
print(user)
}
}
注意:如果你能在可选协议中看到,我还没有写userInfo方法,所以这取决于你。这意味着With和不向类添加方法 它工作得很好。-在协议中作为可选方法调用 类声明类和协议 @objc属性,它只与类而不是struct工作!
第三种方法-使用扩展的可选协议
注意:你可以选择Struct或Class
class UserModel{
var firstname: String = ""
}
OR
struct UserModel{
var firstname: String = ""
}
AND
protocol UserDataSource{
func contactConfiguration(user: UserModel)
}
extension UserDataSource{
func userInfo(user: UserModel){}
}
class myview: UserDataSource{
func contactConfiguration(user: UserModel) {
print(user)
}
}
推荐文章
- 我应该如何从字符串中删除所有的前导空格?- - - - - -斯威夫特
- 如何使用Xcode创建。ipa文件?
- 动态改变UILabel的字体大小
- 在iPhone上确定用户是否启用了推送通知
- 是否有可能禁用浮动头在UITableView与UITableViewStylePlain?
- Swift:理解// MARK
- 错误ITMS-9000:“冗余二进制文件上传。火车1.0版本已经有一个二进制版本上传。
- Swift -转换为绝对值
- Swift编译器错误:“框架模块内的非模块化头”
- 从父iOS访问容器视图控制器
- 自定义dealloc和ARC (Objective-C)
- 调整UITableView的大小以适应内容
- 在代码中为UIButton设置一个图像
- NSRange从Swift Range?
- 为什么空字典在Python中是一个危险的默认值?