我可以在swift中使用2种类型的参数吗?

时间:2016-01-14 10:15:10

标签: ios swift function parameters arguments

所以我已经创建了函数并且它做了一些事情,但是如果参数类型不同,我希望它做其他事情,例如:

func (parameter: unknownType){
    if(typeof parameter == Int){
        //do this
    }else if(typeof parameter == String){
        //do that
    }
}

我已经用javascript或其他编程语言完成了这项工作,但我不知道如何在swift中完成此操作

我已经创建了一个函数,该函数接受一个参数UITextField并使用约束将其居中

现在我想把我的按钮放在中心,但由于按钮不是UITextField类型它不起作用,所以有没有办法告诉函数在UIButton上做同样的事情?

5 个答案:

答案 0 :(得分:2)

使用重载:

class Example
{
    func method(a : String) -> NSString {
    return a;
    }
    func method(a : UInt) -> NSString {
    return "{\(a)}"
    }
}

Example().method("Foo") // "Foo"
Example().method(123) // "{123}"

答案 1 :(得分:0)

它可以 示例代码:

func temFunc(obj:AnyObject){
    if let intValue = obj as? Int{
        print(intValue)
    }else if let str = obj as? String{
        print(str)
    }
}

答案 2 :(得分:0)

您可以使用Any和向下转发:

func foo(bar: Any){
    switch(bar) {
    case let a as String:
        /* do something with String instance 'a' */
        print("The bar is a String, bar = " + a)
    case let a as Int:
        /* do something with Int instance 'a' */
        print("The bar is an Int, bar = \(a)")
    case _ : print("The bar is neither an Int nor a String, bar = \(bar)")
    }
}

/* Example */   
var myString = "Hello"
var myInt = 1
var myDouble = 1.5

foo(myString) // The bar is a String, bar = Hello
foo(myInt)    // The bar is an Int, bar = 1
foo(myDouble) // The bar is neither an Int nor a String, bar = 1.5

答案 3 :(得分:0)

相当于Javascript代码:

func doSomething(parameter: Any?) {
    if let intValue = parameter as? Int {
       // do something with the int
    } else if let stringValue = parameter as? String {
      // do something with the string
    }
}

但要注意,这种方法会让你失去类型安全性,这是Swift最有用的功能之一。

更好的方法是声明一个由您希望允许传递给doSomething的所有类型实现的协议:

protocol MyProtocol {
    func doSomething()
}

extension Int: MyProtocol {
    func doSomething() {
        print("I am an int")
    }
}

extension String: MyProtocol {
    func doSomething() {
        print("I am a string")
    }
}

func doSomething(parameter: MyProtocol) {
    parameter.doSomething()
}


doSomething(1) // will print "I am an int"
doSomething("a") // will print "I am a string"
doSomething(14.0) // compiler error as Double does not conform to MyProtocol

答案 4 :(得分:-1)

检查此解决方案:

https://stackoverflow.com/a/25528882/256738

您可以传递一个对象AnyObject并检查该类,以了解它是什么类型的对象。

<强>更新

好点@Vojtech Vrbka

这是一个例子:

let x : AnyObject = "abc"
switch x {
  case is String: println("I'm a string")
  case is Array: println("I'm an Array")
  // Other cases
  default: println("Unknown")
}