Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 无法调用'';具有类型为'';_Swift_Swift2 - Fatal编程技术网

Swift 无法调用'';具有类型为'';

Swift 无法调用'';具有类型为'';,swift,swift2,Swift,Swift2,在操场(Xcode 7.2(7C68))中,我使用了一个泛型函数并得到了错误: Cannont invoke 'requires' with an argument list of type 'MyClass' 游乐场守则: import Foundation public protocol Proto { func someFunction() } func requires<T: Proto>(param: T) -> Bool { if param

在操场(Xcode 7.2(7C68))中,我使用了一个泛型函数并得到了错误:

Cannont invoke 'requires' with an argument list of type 'MyClass'
游乐场守则:

import Foundation

public protocol Proto {
    func someFunction()
}

func requires<T: Proto>(param: T) -> Bool
{
    if param is NSObject
    {
        return true
    }
    else
    {
        return false
    }
}


class MyClass:NSObject, Proto {
    var name: String
    required init?(response: String){
        self.name = response
    }

    func someFunction(){
        print(name)
    }
}

var m = MyClass(response: "Hey there")
requires(m) //     Cannont invoke 'requires' with an argument list of type 'MyClass'
<代码>导入基础 公共协议协议协议{ func someFunction() } func requires(参数:T)->Bool { 如果param是NSObject { 返回真值 } 其他的 { 返回错误 } } 类MyClass:NSObject,Proto{ 变量名称:String 必需的初始化?(响应:字符串){ self.name=响应 } func someFunction(){ 印刷品(名称) } } var m=MyClass(回答:“你好”) requires(m)//不能使用“MyClass”类型的参数列表调用“requires” 如果我删除init函数,它会工作-你知道为什么吗?:

必需的初始化?(响应:字符串){ self.name=响应 }

因此,是一个可失败的初始值设定项

var m = MyClass(response: "Hey there")
是类型为
MyClass?
的可选项。你必须打开这个值, 或使用可选绑定:

if let m = MyClass(response: "Hey there") {
    requires(m)
}
MyClass
符合
Proto
,但
MyClass?
不符合

但是,您的实现不会失败(即返回
nil
) 因此,您也可以通过删除问号使初始值设定项不失败:

required init(response: String) { ... }
因此,是一个可失败的初始值设定项

var m = MyClass(response: "Hey there")
是类型为
MyClass?
的可选项。你必须打开这个值, 或使用可选绑定:

if let m = MyClass(response: "Hey there") {
    requires(m)
}
MyClass
符合
Proto
,但
MyClass?
不符合

但是,您的实现不会失败(即返回
nil
) 因此,您也可以通过删除问号使初始值设定项不失败:

required init(response: String) { ... }

我通过删除
Proto
解决了这个问题:

更改:

func requires<T: Proto>(param: T) -> Bool
func需要(参数:T)->Bool
致:

func需要(参数:T)->Bool

我通过删除
Proto
解决了这个问题:

更改:

func requires<T: Proto>(param: T) -> Bool
func需要(参数:T)->Bool
致:

func需要(参数:T)->Bool

无法在iOS或OS X游乐场中重现Xcode 7.1.1的错误。谢谢,我使用的是7.2。我将更新问题以包含Xcode版本。更新:我缺少最后一行“requires(m)”。您是否有时间再次尝试-提前感谢?我现在可以重现该问题。无法在iOS或OS X游乐场中重现Xcode 7.1.1的错误。谢谢,我使用的是7.2。我将更新问题以包含Xcode版本。更新:我缺少最后一行“requires(m)”。你有时间再试一次吗?提前谢谢?我现在可以复制这个问题。谢谢JAL,但这将省去协议约束。谢谢JAL,但这将省去协议约束。