Swift中泛型变量的变通方法

时间:2017-06-10 04:50:26

标签: swift variables generics tuples type-alias

所以我有一个typealias元组

public typealias MyTuple<T> = (key: T, value: String)

在我的ViewController中,我想用通用数据类型声明一个MyTuple数组,因为我还不知道键的类型。但是,从this开始,Swift中不可能有泛型变量。还有其他解决方法如下,但我不喜欢它们中的任何一个。谁有更好的想法?

class ViewController: UIViewController {
    var array1 = [MyTuple<T>]() // compile error of course

    var array2 = [MyTuple<Any>]() // no point as I'd use `Any` for MyTuple

    func getArray<T>(array: Array<MyTuple<T>>) -> Array<MyTuple<T>> {
        return array // not a good approach
    }
}

2 个答案:

答案 0 :(得分:2)

您可以使用数组声明的协议和不依赖于键的数据类型的基本方法执行类似的操作:

protocol KeyValueArray
{
   associatedtype KeyType
   var array:[(key:KeyType,value:String)] { get set }
}

extension KeyValueArray
{
   var array:[(key: KeyType, value:String)] { get {return []} set { } }
}

class ViewController:UIViewController,KeyValueArray 
{
   // assuming this is like an "abstact" base class 
   // that won't actually be instantiated.
   typealias KeyType = Any   

   // you can implement base class functions using the array variable
   // as long as they're not dependent on a specific key type.
}

class SpecificVC:ViewController
{
   typealias KeyType = Int 
   var array:[(key:Int,value:String)] = []
}

我假设,在某些时候,视图控制器子类的具体实例将具有键的实际类型

答案 1 :(得分:1)

我认为解决这个问题的通常方法是将依赖关系链中的类型决策“推”到视图控制器:

def stringSplitter(string):
    words = []
    current_word = ""
    for char in string:
        if char == " ":
            words.append(current_word)
            current_word = ""
        else:
            current_word += char
    words.append(current_word)        
    return words

这是有道理的,因为您可能会将控制器视为“foo控制器”,其中“foo”是Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.set(Calendar.HOUR_OF_DAY, 6); calendar.set(Calendar.MINUTE, 0); int interval = 1000 * 60 * 60 * 24; Intent myIntent = new Intent(yourActivity.this, ScheduleNotification .class); pendingIntent = PendingIntent.getBroadcast(UserDashBoardActivity.this, 0, myIntent,0); /* Repeating on every 24 hours interval */ AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), interval, pendingIntent); 的具体值。 (“宠物控制器”,“产品控制器”等)但当然,在知道具体类型之前,不能创建数组实例。