代码之家  ›  专栏  ›  技术社区  ›  nikagar4

我可以在swift中有两种参数类型吗?

  •  3
  • nikagar4  · 技术社区  · 9 年前

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

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

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

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

    现在我想将按钮居中,但由于按钮不是UITextField类型,它不起作用,所以我有没有办法告诉函数在UIButton上执行同样的操作??

    5 回复  |  直到 9 年前
        1
  •  2
  •   Victor Viola    9 年前

    使用过载:

    class Example
    {
        func method(a : String) -> NSString {
        return a;
        }
        func method(a : UInt) -> NSString {
        return "{\(a)}"
        }
    }
    
    Example().method("Foo") // "Foo"
    Example().method(123) // "{123}"
    
        2
  •  1
  •   Cristik    9 年前

    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
    
        3
  •  0
  •   Nguyen Hoan    9 年前

    它可以 示例代码:

    func temFunc(obj:AnyObject){
        if let intValue = obj as? Int{
            print(intValue)
        }else if let str = obj as? String{
            print(str)
        }
    }
    
        4
  •  0
  •   dfrib    9 年前

    你可以利用 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
    
        5
  •  -1
  •   Community Bayu Bramantya    7 年前

    检查此解决方案:

    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")
    }